From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Lively Subject: Re: [PATCH] xc_inflate_buffer fix Date: Wed, 15 Mar 2006 14:59:23 -0500 Message-ID: <4418721B.5040102@virtualiron.com> References: <44185567.6070805@virtualiron.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <44185567.6070805@virtualiron.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: David Lively Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org Oops, forgot: Signed-off-by: David Lively Dave David Lively wrote: > Hi - > I notice some of my initrds are failing to gunzip: > ERROR: inflate failed, sts -5 > These same initrds work fine with Ben Thomas' original > patch introducing xc_{linux,hvm}_build_mem. The checked-in > version changed some declarations from unsigned char * to > char *, breaking the output length computation in xc_inflate_buffer. > This patch assumes you want to keep using the signed char * > for the interface, so it simply inserts a few casts to unsigned. > Tested lightly, but the bug is pretty obvious once you notice > the signedness change ... > > Dave > > > ------------------------------------------------------------------------ > > diff -r 1d741a415927 tools/libxc/xg_private.c > --- a/tools/libxc/xg_private.c Wed Mar 15 11:48:33 2006 -0500 > +++ b/tools/libxc/xg_private.c Wed Mar 15 12:28:05 2006 -0500 > @@ -77,10 +77,11 @@ char *xc_inflate_buffer(const char *in_b > return (char *)in_buf; > } > > - out_len = in_buf[in_size-4] + > - (256 * (in_buf[in_size-3] + > - (256 * (in_buf[in_size-2] + > - (256 * in_buf[in_size-1]))))); > + out_len = (unsigned char)in_buf[in_size-4] + > + (256 * ((unsigned char)in_buf[in_size-3] + > + (256 * ((unsigned char)in_buf[in_size-2] + > + (256 * (unsigned char)in_buf[in_size-1]))))); > + > bzero(&zStream, sizeof(zStream)); > out_buf = malloc(out_len + 16); /* Leave a little extra space */ > if ( out_buf == NULL )