581{
584 unsigned char FAR *put;
587 unsigned bits;
588 unsigned in, out;
589 unsigned copy;
590 unsigned char FAR *from;
593 unsigned len;
594 int ret;
595#ifdef GUNZIP
596 unsigned char hbuf[4];
597#endif
598 static const unsigned short order[19] =
599 {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
600
602 (strm->next_in ==
Z_NULL && strm->avail_in != 0))
604
609 out = left;
611 for (;;)
612 switch (state->
mode) {
614 if (state->
wrap == 0) {
616 break;
617 }
619#ifdef GUNZIP
620 if ((state->
wrap & 2) &&
hold == 0x8b1f) {
625 break;
626 }
629 state->
head->done = -1;
630 if (!(state->
wrap & 1) ||
631#else
633#endif
634 ((
BITS(8) << 8) + (
hold >> 8)) % 31) {
635 strm->msg = (char *)"incorrect header check";
637 break;
638 }
640 strm->msg = (char *)"unknown compression method";
642 break;
643 }
646 if (state->
wbits == 0)
648 else if (len > state->
wbits) {
649 strm->msg = (char *)"invalid window size";
651 break;
652 }
653 state->
dmax = 1U << len;
654 Tracev((stderr,
"inflate: zlib header ok\n"));
658 break;
659#ifdef GUNZIP
664 strm->msg = (char *)"unknown compression method";
666 break;
667 }
668 if (state->
flags & 0xe000) {
669 strm->msg = (char *)"unknown header flags set";
671 break;
672 }
674 state->
head->text = (int)((
hold >> 8) & 1);
688 state->
head->xflags = (int)(
hold & 0xff);
690 }
695 if (state->
flags & 0x0400) {
699 state->
head->extra_len = (unsigned)
hold;
702 }
707 if (state->
flags & 0x0400) {
710 if (copy) {
715 len + copy > state->
head->extra_max ?
716 state->
head->extra_max - len : copy);
717 }
718 if (state->
flags & 0x0200)
723 }
724 if (state->
length)
goto inf_leave;
725 }
729 if (state->
flags & 0x0800) {
730 if (
have == 0)
goto inf_leave;
731 copy = 0;
732 do {
733 len = (unsigned)(
next[copy++]);
738 }
while (len && copy <
have);
739 if (state->
flags & 0x0200)
743 if (len) goto inf_leave;
744 }
750 if (state->
flags & 0x1000) {
751 if (
have == 0)
goto inf_leave;
752 copy = 0;
753 do {
754 len = (unsigned)(
next[copy++]);
759 }
while (len && copy <
have);
760 if (state->
flags & 0x0200)
764 if (len) goto inf_leave;
765 }
770 if (state->
flags & 0x0200) {
773 strm->msg = (char *)"header crc mismatch";
775 break;
776 }
778 }
780 state->
head->hcrc = (int)((state->
flags >> 9) & 1);
781 state->
head->done = 1;
782 }
785 break;
786#endif
796 }
805 break;
806 }
811 case 0:
812 Tracev((stderr,
"inflate: stored block%s\n",
813 state->
last ?
" (last)" :
""));
815 break;
816 case 1:
818 Tracev((stderr,
"inflate: fixed codes block%s\n",
819 state->
last ?
" (last)" :
""));
823 goto inf_leave;
824 }
825 break;
826 case 2:
827 Tracev((stderr,
"inflate: dynamic codes block%s\n",
828 state->
last ?
" (last)" :
""));
830 break;
831 case 3:
832 strm->msg = (char *)"invalid block type";
834 }
836 break;
840 if ((
hold & 0xffff) != ((
hold >> 16) ^ 0xffff)) {
841 strm->msg = (char *)"invalid stored block lengths";
843 break;
844 }
846 Tracev((stderr,
"inflate: stored length %u\n",
850 if (flush ==
Z_TREES)
goto inf_leave;
855 if (copy) {
857 if (copy > left) copy = left;
858 if (copy == 0) goto inf_leave;
862 left -= copy;
863 put += copy;
865 break;
866 }
867 Tracev((stderr,
"inflate: stored end\n"));
869 break;
878#ifndef PKZIP_BUG_WORKAROUND
879 if (state->
nlen > 286 || state->
ndist > 30) {
880 strm->msg = (char *)"too many length or distance symbols";
882 break;
883 }
884#endif
885 Tracev((stderr,
"inflate: table sizes ok\n"));
891 state->
lens[order[state->
have++]] = (
unsigned short)
BITS(3);
893 }
894 while (state->
have < 19)
895 state->
lens[order[state->
have++]] = 0;
901 if (ret) {
902 strm->msg = (char *)"invalid code lengths set";
904 break;
905 }
906 Tracev((stderr,
"inflate: code lengths ok\n"));
911 for (;;) {
913 if ((
unsigned)(here.
bits) <= bits)
break;
915 }
920 }
921 else {
922 if (here.
val == 16) {
925 if (state->
have == 0) {
926 strm->msg = (char *)"invalid bit length repeat";
928 break;
929 }
933 }
934 else if (here.
val == 17) {
937 len = 0;
940 }
941 else {
944 len = 0;
947 }
949 strm->msg = (char *)"invalid bit length repeat";
951 break;
952 }
953 while (copy--)
954 state->
lens[state->
have++] = (
unsigned short)len;
955 }
956 }
957
958
960
961
962 if (state->
lens[256] == 0) {
963 strm->msg = (char *)"invalid code -- missing end-of-block";
965 break;
966 }
967
968
969
970
976 if (ret) {
977 strm->msg = (char *)"invalid literal/lengths set";
979 break;
980 }
985 if (ret) {
986 strm->msg = (char *)"invalid distances set";
988 break;
989 }
990 Tracev((stderr,
"inflate: codes ok\n"));
992 if (flush ==
Z_TREES)
goto inf_leave;
996 if (
have >= 6 && left >= 258) {
1002 break;
1003 }
1005 for (;;) {
1007 if ((
unsigned)(here.
bits) <= bits)
break;
1009 }
1010 if (here.
op && (here.
op & 0xf0) == 0) {
1012 for (;;) {
1015 if ((
unsigned)(
last.bits + here.
bits) <= bits)
break;
1017 }
1020 }
1024 if ((
int)(here.
op) == 0) {
1026 "inflate: literal '%c'\n" :
1027 "inflate: literal 0x%02x\n", here.
val));
1029 break;
1030 }
1032 Tracevv((stderr,
"inflate: end of block\n"));
1035 break;
1036 }
1038 strm->msg = (char *)"invalid literal/length code";
1040 break;
1041 }
1042 state->
extra = (unsigned)(here.
op) & 15;
1050 }
1055 for (;;) {
1057 if ((
unsigned)(here.
bits) <= bits)
break;
1059 }
1060 if ((here.
op & 0xf0) == 0) {
1062 for (;;) {
1065 if ((
unsigned)(
last.bits + here.
bits) <= bits)
break;
1067 }
1070 }
1074 strm->msg = (char *)"invalid distance code";
1076 break;
1077 }
1079 state->
extra = (unsigned)(here.
op) & 15;
1087 }
1088#ifdef INFLATE_STRICT
1090 strm->msg = (char *)"invalid distance too far back";
1092 break;
1093 }
1094#endif
1098 if (left == 0) goto inf_leave;
1099 copy = out - left;
1100 if (state->
offset > copy) {
1101 copy = state->
offset - copy;
1102 if (copy > state->
whave) {
1104 strm->msg = (char *)"invalid distance too far back";
1106 break;
1107 }
1108#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1109 Trace((stderr,
"inflate.c too far\n"));
1110 copy -= state->
whave;
1112 if (copy > left) copy = left;
1113 left -= copy;
1115 do {
1116 *put++ = 0;
1117 } while (--copy);
1119 break;
1120#endif
1121 }
1122 if (copy > state->
wnext) {
1123 copy -= state->
wnext;
1125 }
1126 else
1129 }
1130 else {
1131 from = put - state->
offset;
1133 }
1134 if (copy > left) copy = left;
1135 left -= copy;
1137 do {
1138 *put++ = *from++;
1139 } while (--copy);
1141 break;
1143 if (left == 0) goto inf_leave;
1144 *put++ = (
unsigned char)(state->
length);
1145 left--;
1147 break;
1151 out -= left;
1152 strm->total_out += out;
1153 state->
total += out;
1154 if (out)
1155 strm->adler = state->
check =
1157 out = left;
1158 if ((
1161#endif
1163 strm->msg = (char *)"incorrect data check";
1165 break;
1166 }
1168 Tracev((stderr,
"inflate: check matches trailer\n"));
1169 }
1170#ifdef GUNZIP
1175 if (
hold != (state->
total & 0xffffffffUL)) {
1176 strm->msg = (char *)"incorrect length check";
1178 break;
1179 }
1181 Tracev((stderr,
"inflate: length matches trailer\n"));
1182 }
1183#endif
1187 goto inf_leave;
1190 goto inf_leave;
1194 default:
1196 }
1197
1198
1199
1200
1201
1202
1203
1204 inf_leave:
1206 if (state->
wsize || (state->
mode <
CHECK && out != strm->avail_out))
1210 }
1211 in -= strm->avail_in;
1212 out -= strm->avail_out;
1213 strm->total_in += in;
1214 strm->total_out += out;
1215 state->
total += out;
1216 if (state->
wrap && out)
1217 strm->adler = state->
check =
1219 strm->data_type = state->
bits + (state->
last ? 64 : 0) +
1222 if (((in == 0 && out == 0) || flush ==
Z_FINISH) && ret ==
Z_OK)
1224 return ret;
1225}
void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start)
local int updatewindow(z_streamp strm, unsigned out)
#define CRC2(check, word)
local void fixedtables(struct inflate_state FAR *state)
#define CRC4(check, word)
#define UPDATE(check, buf, len)
code const FAR * distcode
unsigned char FAR * window
void ZLIB_INTERNAL zmemcpy(Bytef *dest, const Bytef *source, uInt len)