Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 39b7ee06 authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Andi Kleen
Browse files

[PATCH] x86-64: deflate inflate_dynamic too



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".

Signed-off-by: default avatarJeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
parent 35c74226
Loading
Loading
Loading
Loading
+41 −20
Original line number Diff line number Diff line
@@ -798,16 +798,19 @@ STATIC int noinline INIT inflate_dynamic(void)
  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;
  k = bk;
@@ -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;
      }
      while (j--)
        ll[i++] = l;
    }
@@ -882,8 +891,10 @@ DEBG("dyn3 ");
      NEEDBITS(3)
      j = 3 + ((unsigned)b & 7);
      DUMPBITS(3)
      if ((unsigned)i + j > n)
        return 1;
      if ((unsigned)i + j > n) {
        ret = 1;
	goto out;
      }
      while (j--)
        ll[i++] = 0;
      l = 0;
@@ -893,8 +904,10 @@ DEBG("dyn3 ");
      NEEDBITS(7)
      j = 11 + ((unsigned)b & 0x7f);
      DUMPBITS(7)
      if ((unsigned)i + j > n)
        return 1;
      if ((unsigned)i + j > n) {
        ret = 1;
	goto out;
      }
      while (j--)
        ll[i++] = 0;
      l = 0;
@@ -923,7 +936,8 @@ DEBG("dyn5b ");
      error("incomplete literal tree");
      huft_free(tl);
    }
    return i;                   /* incomplete code set */
    ret = i;                   /* incomplete code set */
    goto out;
  }
DEBG("dyn5c ");
  bd = dbits;
@@ -939,15 +953,18 @@ DEBG("dyn5d ");
      huft_free(td);
    }
    huft_free(tl);
    return i;                   /* incomplete code set */
    ret = i;                   /* incomplete code set */
    goto out;
#endif
  }

DEBG("dyn6 ");

  /* decompress until an end-of-block code */
  if (inflate_codes(tl, td, bl, bd))
    return 1;
  if (inflate_codes(tl, td, bl, bd)) {
    ret = 1;
    goto out;
  }

DEBG("dyn7 ");

@@ -956,10 +973,14 @@ DEBG("dyn7 ");
  huft_free(td);

  DEBG(">");
  return 0;
  ret = 0;
out:
  free(ll);
  return ret;

underrun:
  return 4;			/* Input underrun */
  ret = 4;			/* Input underrun */
  goto out;
}