Messages in this thread | | | Date | Sat, 28 Apr 2007 11:22:52 -0500 | From | Matt Mackall <> | Subject | Re: [PATCH] deflate inflate_dynamic too |
| |
On Fri, Apr 27, 2007 at 07:20:07PM -0700, Jeremy Fitzhardinge wrote: > inflate_dynamic() has piggy stack usage too, so heap allocate it too. > I'm not sure it actually gets used, but it shows up large in "make > checkstack".
Might as well drop the PKZIP bit while we're at it. No one's ever built a zimage with PKZIP.
> Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com> > > --- > lib/inflate.c | 63 ++++++++++++++++++++++++++++++++++++++------------------- > 1 file changed, 42 insertions(+), 21 deletions(-) > > =================================================================== > --- a/lib/inflate.c > +++ b/lib/inflate.c > @@ -798,15 +798,18 @@ STATIC int noinline INIT inflate_dynamic > unsigned nb; /* number of bit length codes */ > unsigned nl; /* number of literal/length codes */ > unsigned nd; /* number of distance codes */ > -#ifdef PKZIP_BUG_WORKAROUND > - unsigned ll[288+32]; /* literal/length and distance code lengths */ > -#else > - unsigned ll[286+30]; /* literal/length and distance code lengths */ > -#endif > + unsigned *ll; /* literal/length and distance code lengths */ > register ulg b; /* bit buffer */ > register unsigned k; /* number of bits in bit buffer */ > + int ret; > > DEBG("<dyn"); > + > +#ifdef PKZIP_BUG_WORKAROUND > + ll = malloc(sizeof(*ll) * (288+32)); /* literal/length and distance code lengths */ > +#else > + ll = malloc(sizeof(*ll) * (286+30)); /* literal/length and distance code lengths */ > +#endif > > /* make local bit buffer */ > b = bb; > @@ -828,7 +831,10 @@ DEBG("<dyn"); > #else > if (nl > 286 || nd > 30) > #endif > - return 1; /* bad lengths */ > + { > + ret = 1; /* bad lengths */ > + goto out; > + } > > DEBG("dyn1 "); > > @@ -850,7 +856,8 @@ DEBG("dyn2 "); > { > if (i == 1) > huft_free(tl); > - return i; /* incomplete code set */ > + ret = i; /* incomplete code set */ > + goto out; > } > > DEBG("dyn3 "); > @@ -872,8 +879,10 @@ DEBG("dyn3 "); > NEEDBITS(2) > j = 3 + ((unsigned)b & 3); > DUMPBITS(2) > - if ((unsigned)i + j > n) > - return 1; > + if ((unsigned)i + j > n) { > + ret = 1; > + goto out;
Heh. Anti-tab damage.
-- Mathematics is the supreme nostalgia of our time. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |