Re: [PATCH] deflate inflate_dynamic too

From: Matt Mackall
Date: Sat Apr 28 2007 - 12:36:11 EST


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@xxxxxxxxxxxxx>
>
> ---
> 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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/