Skip to content

Commit 39b7ee0

Browse files
jsgfAndi Kleen
authored andcommitted
[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: Jeremy Fitzhardinge <jeremy@xensource.com> Signed-off-by: Andi Kleen <ak@suse.de>
1 parent 35c7422 commit 39b7ee0

File tree

1 file changed

+41
-20
lines changed

1 file changed

+41
-20
lines changed

lib/inflate.c

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -798,16 +798,19 @@ STATIC int noinline INIT inflate_dynamic(void)
798798
unsigned nb; /* number of bit length codes */
799799
unsigned nl; /* number of literal/length codes */
800800
unsigned nd; /* number of distance codes */
801-
#ifdef PKZIP_BUG_WORKAROUND
802-
unsigned ll[288+32]; /* literal/length and distance code lengths */
803-
#else
804-
unsigned ll[286+30]; /* literal/length and distance code lengths */
805-
#endif
801+
unsigned *ll; /* literal/length and distance code lengths */
806802
register ulg b; /* bit buffer */
807803
register unsigned k; /* number of bits in bit buffer */
804+
int ret;
808805

809806
DEBG("<dyn");
810807

808+
#ifdef PKZIP_BUG_WORKAROUND
809+
ll = malloc(sizeof(*ll) * (288+32)); /* literal/length and distance code lengths */
810+
#else
811+
ll = malloc(sizeof(*ll) * (286+30)); /* literal/length and distance code lengths */
812+
#endif
813+
811814
/* make local bit buffer */
812815
b = bb;
813816
k = bk;
@@ -828,7 +831,10 @@ DEBG("<dyn");
828831
#else
829832
if (nl > 286 || nd > 30)
830833
#endif
831-
return 1; /* bad lengths */
834+
{
835+
ret = 1; /* bad lengths */
836+
goto out;
837+
}
832838

833839
DEBG("dyn1 ");
834840

@@ -850,7 +856,8 @@ DEBG("dyn2 ");
850856
{
851857
if (i == 1)
852858
huft_free(tl);
853-
return i; /* incomplete code set */
859+
ret = i; /* incomplete code set */
860+
goto out;
854861
}
855862

856863
DEBG("dyn3 ");
@@ -872,8 +879,10 @@ DEBG("dyn3 ");
872879
NEEDBITS(2)
873880
j = 3 + ((unsigned)b & 3);
874881
DUMPBITS(2)
875-
if ((unsigned)i + j > n)
876-
return 1;
882+
if ((unsigned)i + j > n) {
883+
ret = 1;
884+
goto out;
885+
}
877886
while (j--)
878887
ll[i++] = l;
879888
}
@@ -882,8 +891,10 @@ DEBG("dyn3 ");
882891
NEEDBITS(3)
883892
j = 3 + ((unsigned)b & 7);
884893
DUMPBITS(3)
885-
if ((unsigned)i + j > n)
886-
return 1;
894+
if ((unsigned)i + j > n) {
895+
ret = 1;
896+
goto out;
897+
}
887898
while (j--)
888899
ll[i++] = 0;
889900
l = 0;
@@ -893,8 +904,10 @@ DEBG("dyn3 ");
893904
NEEDBITS(7)
894905
j = 11 + ((unsigned)b & 0x7f);
895906
DUMPBITS(7)
896-
if ((unsigned)i + j > n)
897-
return 1;
907+
if ((unsigned)i + j > n) {
908+
ret = 1;
909+
goto out;
910+
}
898911
while (j--)
899912
ll[i++] = 0;
900913
l = 0;
@@ -923,7 +936,8 @@ DEBG("dyn5b ");
923936
error("incomplete literal tree");
924937
huft_free(tl);
925938
}
926-
return i; /* incomplete code set */
939+
ret = i; /* incomplete code set */
940+
goto out;
927941
}
928942
DEBG("dyn5c ");
929943
bd = dbits;
@@ -939,15 +953,18 @@ DEBG("dyn5d ");
939953
huft_free(td);
940954
}
941955
huft_free(tl);
942-
return i; /* incomplete code set */
956+
ret = i; /* incomplete code set */
957+
goto out;
943958
#endif
944959
}
945960

946961
DEBG("dyn6 ");
947962

948963
/* decompress until an end-of-block code */
949-
if (inflate_codes(tl, td, bl, bd))
950-
return 1;
964+
if (inflate_codes(tl, td, bl, bd)) {
965+
ret = 1;
966+
goto out;
967+
}
951968

952969
DEBG("dyn7 ");
953970

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

958975
DEBG(">");
959-
return 0;
976+
ret = 0;
977+
out:
978+
free(ll);
979+
return ret;
960980

961-
underrun:
962-
return 4; /* Input underrun */
981+
underrun:
982+
ret = 4; /* Input underrun */
983+
goto out;
963984
}
964985

965986

0 commit comments

Comments
 (0)