[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Ping: [PATCH v2] libxc: don't fail domain creation when unpacking initrd fails



>>> On 04.12.17 at 13:46,  wrote:
> At least Linux kernels have been able to work with gzip-ed initrd for
> quite some time; initrd compressed with other methods aren't even being
> attempted to unpack. Furthermore the unzip-ing routine used here isn't
> capable of dealing with various forms of concatenated files, each of
> which was gzip-ed separately (it is this particular case which has been
> the source of observed VM creation failures).
> 
> Hence, if unpacking fails, simply hand the the compressed blob to the
> guest as is.
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> v2: Almost full re-work, hopefully better meeting Ian's taste.
> 
> --- a/tools/libxc/include/xc_dom.h
> +++ b/tools/libxc/include/xc_dom.h
> @@ -291,7 +291,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);
> --- a/tools/libxc/xc_dom_core.c
> +++ b/tools/libxc/xc_dom_core.c
> @@ -314,22 +314,6 @@ 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)
> -{
> -    /* No limit */
> -    if ( !dom->max_ramdisk_size )
> -        return 0;
> -
> -    if ( sz > dom->max_ramdisk_size )
> -    {
> -        xc_dom_panic(dom->xch, XC_INVALID_KERNEL,
> -                     "ramdisk image too large");
> -        return 1;
> -    }
> -
> -    return 0;
> -}
> -
>  /* ------------------------------------------------------------------------ 
> */
>  /* read files, copy memory blocks, with transparent gunzip                  
> */
>  
> @@ -996,16 +980,27 @@ static int xc_dom_build_ramdisk(struct x
>      void *ramdiskmap;
>  
>      if ( !dom->ramdisk_seg.vstart )
> -    {
>          unziplen = xc_dom_check_gzip(dom->xch,
>                                       dom->ramdisk_blob, dom->ramdisk_size);
> -        if ( xc_dom_ramdisk_check_size(dom, unziplen) != 0 )
> -            unziplen = 0;
> -    }
>      else
>          unziplen = 0;
>  
> -    ramdisklen = unziplen ? unziplen : dom->ramdisk_size;
> +    ramdisklen = max(unziplen, dom->ramdisk_size);
> +    if ( dom->max_ramdisk_size )
> +    {
> +        if ( unziplen && ramdisklen > dom->max_ramdisk_size )
> +        {
> +            ramdisklen = min(unziplen, dom->ramdisk_size);
> +            if ( unziplen > ramdisklen)
> +                unziplen = 0;
> +        }
> +        if ( ramdisklen > dom->max_ramdisk_size )
> +        {
> +            xc_dom_panic(dom->xch, XC_INVALID_KERNEL,
> +                         "ramdisk image too large");
> +            goto err;
> +        }
> +    }
>  
>      if ( xc_dom_alloc_segment(dom, &dom->ramdisk_seg, "ramdisk",
>                                dom->ramdisk_seg.vstart, ramdisklen) != 0 )
> @@ -1020,11 +1015,18 @@ static int xc_dom_build_ramdisk(struct x
>      if ( unziplen )
>      {
>          if ( xc_dom_do_gunzip(dom->xch, dom->ramdisk_blob, dom->ramdisk_size,
> -                              ramdiskmap, ramdisklen) == -1 )
> +                              ramdiskmap, unziplen) != -1 )
> +            return 0;
> +        if ( dom->ramdisk_size > ramdisklen )
>              goto err;
>      }
> -    else
> -        memcpy(ramdiskmap, dom->ramdisk_blob, dom->ramdisk_size);
> +
> +    /* Fall back to handing over the raw blob. */
> +    memcpy(ramdiskmap, dom->ramdisk_blob, dom->ramdisk_size);
> +    /* If an unzip attempt was made, the buffer may no longer be all zero. */
> +    if ( unziplen > dom->ramdisk_size )
> +        memset(ramdiskmap + dom->ramdisk_size, 0,
> +               unziplen - dom->ramdisk_size);
>  
>      return 0;
>  
> 
> 
> 




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.