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 */
openSUSE Build Service is sponsored by