[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxc: don't fail domain creation when unpacking initrd fails
>>> On 19.10.17 at 17:06, <ian.jackson@xxxxxxxxxxxxx> wrote: > Jan Beulich writes ("Re: [PATCH] libxc: don't fail domain creation when > unpacking initrd fails"): >> On 16.10.17 at 18:43, <ian.jackson@xxxxxxxxxxxxx> wrote: >> > I'm afraid I still find the patch less clear than it could be. >> > The new semantics of xc_dom_ramdisk_check_size are awkward. And >> > looking at it briefly, I think it might be possible to try the unzip >> > even if the size is too large. >> >> I don't think so - xc_dom_ramdisk_check_size() returns 1 >> whenever decompressed size is above the limit. What I do >> admit is that in the case compressed size is larger than >> uncompressed size, with the boundary being in between, and >> with decompression failing, we may accept something that's >> above the limit. Not sure how bad that is though, as the limit >> is pretty arbitrary anyway. > > Conceptually what you are trying to do is have two alternative > strategies. Those two strategies have different limits. So "the > limit" is not a meaningful concept. > >> > What you are really trying to do here is to pursue two strategies in >> > parallel. And ideally they would not be entangled. >> >> I would have wanted to do things in sequence rather than in >> parallel. I can't see how that could work though, in particular >> when considering the case mentioned above (uncompressed size >> smaller than compressed) - as the space allocation in the guest >> can't be reverted, I need to allocate the larger of the two sizes >> anyway. > > I don't think it can work. I think you uneed to pursue them in > parallel and keep separate records, for each one, of whether we are > still pursuing it or whether it has failed (and of course its > necessary locals). So before I do another pointless round of backporting (for the change to be tested in the environment where it is needed), does the below new function (with xc_dom_ramdisk_check_size() dropped altogether) look any better to you? Thanks, Jan static int xc_dom_build_ramdisk(struct xc_dom_image *dom) { size_t unziplen, ramdisklen; void *ramdiskmap; if ( !dom->ramdisk_seg.vstart ) unziplen = xc_dom_check_gzip(dom->xch, dom->ramdisk_blob, dom->ramdisk_size); else unziplen = 0; 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 ) goto err; ramdiskmap = xc_dom_seg_to_ptr(dom, &dom->ramdisk_seg); if ( ramdiskmap == NULL ) { DOMPRINTF("%s: xc_dom_seg_to_ptr(dom, &dom->ramdisk_seg) => NULL", __FUNCTION__); goto err; } if ( unziplen ) { if ( xc_dom_do_gunzip(dom->xch, dom->ramdisk_blob, dom->ramdisk_size, ramdiskmap, unziplen) != -1 ) return 0; if ( dom->ramdisk_size > ramdisklen ) goto err; } /* 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; err: return -1; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |