File libxc-suppress-ramdisk-unzip.patch of Package xen.6117
Index: xen-4.5.5-testing/tools/libxc/include/xc_dom.h
===================================================================
--- xen-4.5.5-testing.orig/tools/libxc/include/xc_dom.h
+++ xen-4.5.5-testing/tools/libxc/include/xc_dom.h
@@ -236,7 +236,6 @@ int xc_dom_mem_init(struct xc_dom_image
int xc_dom_kernel_check_size(struct xc_dom_image *dom, size_t sz);
int xc_dom_kernel_max_size(struct xc_dom_image *dom, size_t sz);
-int xc_dom_ramdisk_check_size(struct xc_dom_image *dom, size_t sz);
int xc_dom_ramdisk_max_size(struct xc_dom_image *dom, size_t sz);
int xc_dom_devicetree_max_size(struct xc_dom_image *dom, size_t sz);
Index: xen-4.5.5-testing/tools/libxc/xc_dom_core.c
===================================================================
--- xen-4.5.5-testing.orig/tools/libxc/xc_dom_core.c
+++ xen-4.5.5-testing/tools/libxc/xc_dom_core.c
@@ -314,7 +314,8 @@ int xc_dom_kernel_check_size(struct xc_d
return 0;
}
-int xc_dom_ramdisk_check_size(struct xc_dom_image *dom, size_t sz)
+static int xc_dom_ramdisk_check_size(struct xc_dom_image *dom, size_t sz,
+ size_t raw)
{
/* No limit */
if ( !dom->max_ramdisk_size )
@@ -322,8 +323,9 @@ int xc_dom_ramdisk_check_size(struct xc_
if ( sz > dom->max_ramdisk_size )
{
- xc_dom_panic(dom->xch, XC_INVALID_KERNEL,
- "ramdisk image too large");
+ if ( raw > dom->max_ramdisk_size )
+ xc_dom_panic(dom->xch, XC_INVALID_KERNEL,
+ "ramdisk image too large");
return 1;
}
@@ -992,13 +994,13 @@ int xc_dom_build_image(struct xc_dom_ima
{
unziplen = xc_dom_check_gzip(dom->xch,
dom->ramdisk_blob, dom->ramdisk_size);
- if ( xc_dom_ramdisk_check_size(dom, unziplen) != 0 )
+ if ( xc_dom_ramdisk_check_size(dom, unziplen, dom->ramdisk_size) != 0 )
unziplen = 0;
}
else
unziplen = 0;
- ramdisklen = unziplen ? unziplen : dom->ramdisk_size;
+ ramdisklen = max(unziplen, dom->ramdisk_size);
if ( xc_dom_alloc_segment(dom, &dom->ramdisk_seg, "ramdisk",
dom->ramdisk_seg.vstart,
@@ -1011,15 +1013,15 @@ int xc_dom_build_image(struct xc_dom_ima
__FUNCTION__);
goto err;
}
- if ( unziplen )
+ if ( !unziplen ||
+ xc_dom_do_gunzip(dom->xch, dom->ramdisk_blob, dom->ramdisk_size,
+ ramdiskmap, unziplen) == -1 )
{
- if ( xc_dom_do_gunzip(dom->xch,
- dom->ramdisk_blob, dom->ramdisk_size,
- ramdiskmap, ramdisklen) == -1 )
- goto err;
- }
- else
memcpy(ramdiskmap, dom->ramdisk_blob, dom->ramdisk_size);
+ if ( unziplen > dom->ramdisk_size )
+ memset(ramdiskmap + dom->ramdisk_size, 0,
+ unziplen - dom->ramdisk_size);
+ }
}
/* load devicetree */