File libxc-suppress-ramdisk-unzip.patch of Package xen.6114

Index: xen-4.7.3-testing/tools/libxc/include/xc_dom.h
===================================================================
--- xen-4.7.3-testing.orig/tools/libxc/include/xc_dom.h
+++ xen-4.7.3-testing/tools/libxc/include/xc_dom.h
@@ -318,7 +318,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.7.3-testing/tools/libxc/xc_dom_core.c
===================================================================
--- xen-4.7.3-testing.orig/tools/libxc/xc_dom_core.c
+++ xen-4.7.3-testing/tools/libxc/xc_dom_core.c
@@ -313,7 +313,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 )
@@ -321,8 +322,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;
     }
 
@@ -1006,13 +1008,13 @@ static int xc_dom_build_ramdisk(struct x
     {
         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, ramdisklen) != 0 )
@@ -1024,14 +1026,15 @@ static int xc_dom_build_ramdisk(struct x
                   __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);
+    }
 
     return 0;
 
openSUSE Build Service is sponsored by