aboutsummaryrefslogtreecommitdiffstats
path: root/lib/inflate.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/inflate.c')
-rw-r--r--lib/inflate.c61
1 files changed, 41 insertions, 20 deletions
diff --git a/lib/inflate.c b/lib/inflate.c
index 88a22f4a49df..845f91d3ac12 100644
--- a/lib/inflate.c
+++ b/lib/inflate.c
@@ -798,16 +798,19 @@ STATIC int noinline INIT inflate_dynamic(void)
798 unsigned nb; /* number of bit length codes */ 798 unsigned nb; /* number of bit length codes */
799 unsigned nl; /* number of literal/length codes */ 799 unsigned nl; /* number of literal/length codes */
800 unsigned nd; /* number of distance codes */ 800 unsigned nd; /* number of distance codes */
801#ifdef PKZIP_BUG_WORKAROUND 801 unsigned *ll; /* literal/length and distance code lengths */
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
806 register ulg b; /* bit buffer */ 802 register ulg b; /* bit buffer */
807 register unsigned k; /* number of bits in bit buffer */ 803 register unsigned k; /* number of bits in bit buffer */
804 int ret;
808 805
809DEBG("<dyn"); 806DEBG("<dyn");
810 807
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
811 /* make local bit buffer */ 814 /* make local bit buffer */
812 b = bb; 815 b = bb;
813 k = bk; 816 k = bk;
@@ -828,7 +831,10 @@ DEBG("<dyn");
828#else 831#else
829 if (nl > 286 || nd > 30) 832 if (nl > 286 || nd > 30)
830#endif 833#endif
831 return 1; /* bad lengths */ 834 {
835 ret = 1; /* bad lengths */
836 goto out;
837 }
832 838
833DEBG("dyn1 "); 839DEBG("dyn1 ");
834 840
@@ -850,7 +856,8 @@ DEBG("dyn2 ");
850 { 856 {
851 if (i == 1) 857 if (i == 1)
852 huft_free(tl); 858 huft_free(tl);
853 return i; /* incomplete code set */ 859 ret = i; /* incomplete code set */
860 goto out;
854 } 861 }
855 862
856DEBG("dyn3 "); 863DEBG("dyn3 ");
@@ -872,8 +879,10 @@ DEBG("dyn3 ");
872 NEEDBITS(2) 879 NEEDBITS(2)
873 j = 3 + ((unsigned)b & 3); 880 j = 3 + ((unsigned)b & 3);
874 DUMPBITS(2) 881 DUMPBITS(2)
875 if ((unsigned)i + j > n) 882 if ((unsigned)i + j > n) {
876 return 1; 883 ret = 1;
884 goto out;
885 }
877 while (j--) 886 while (j--)
878 ll[i++] = l; 887 ll[i++] = l;
879 } 888 }
@@ -882,8 +891,10 @@ DEBG("dyn3 ");
882 NEEDBITS(3) 891 NEEDBITS(3)
883 j = 3 + ((unsigned)b & 7); 892 j = 3 + ((unsigned)b & 7);
884 DUMPBITS(3) 893 DUMPBITS(3)
885 if ((unsigned)i + j > n) 894 if ((unsigned)i + j > n) {
886 return 1; 895 ret = 1;
896 goto out;
897 }
887 while (j--) 898 while (j--)
888 ll[i++] = 0; 899 ll[i++] = 0;
889 l = 0; 900 l = 0;
@@ -893,8 +904,10 @@ DEBG("dyn3 ");
893 NEEDBITS(7) 904 NEEDBITS(7)
894 j = 11 + ((unsigned)b & 0x7f); 905 j = 11 + ((unsigned)b & 0x7f);
895 DUMPBITS(7) 906 DUMPBITS(7)
896 if ((unsigned)i + j > n) 907 if ((unsigned)i + j > n) {
897 return 1; 908 ret = 1;
909 goto out;
910 }
898 while (j--) 911 while (j--)
899 ll[i++] = 0; 912 ll[i++] = 0;
900 l = 0; 913 l = 0;
@@ -923,7 +936,8 @@ DEBG("dyn5b ");
923 error("incomplete literal tree"); 936 error("incomplete literal tree");
924 huft_free(tl); 937 huft_free(tl);
925 } 938 }
926 return i; /* incomplete code set */ 939 ret = i; /* incomplete code set */
940 goto out;
927 } 941 }
928DEBG("dyn5c "); 942DEBG("dyn5c ");
929 bd = dbits; 943 bd = dbits;
@@ -939,15 +953,18 @@ DEBG("dyn5d ");
939 huft_free(td); 953 huft_free(td);
940 } 954 }
941 huft_free(tl); 955 huft_free(tl);
942 return i; /* incomplete code set */ 956 ret = i; /* incomplete code set */
957 goto out;
943#endif 958#endif
944 } 959 }
945 960
946DEBG("dyn6 "); 961DEBG("dyn6 ");
947 962
948 /* decompress until an end-of-block code */ 963 /* decompress until an end-of-block code */
949 if (inflate_codes(tl, td, bl, bd)) 964 if (inflate_codes(tl, td, bl, bd)) {
950 return 1; 965 ret = 1;
966 goto out;
967 }
951 968
952DEBG("dyn7 "); 969DEBG("dyn7 ");
953 970
@@ -956,10 +973,14 @@ DEBG("dyn7 ");
956 huft_free(td); 973 huft_free(td);
957 974
958 DEBG(">"); 975 DEBG(">");
959 return 0; 976 ret = 0;
977out:
978 free(ll);
979 return ret;
960 980
961 underrun: 981underrun:
962 return 4; /* Input underrun */ 982 ret = 4; /* Input underrun */
983 goto out;
963} 984}
964 985
965 986