OLD | NEW |
1 /* inflate.c -- zlib decompression | 1 /* inflate.c -- zlib decompression |
2 * Copyright (C) 1995-2005 Mark Adler | 2 * Copyright (C) 1995-2010 Mark Adler |
3 * For conditions of distribution and use, see copyright notice in zlib.h | 3 * For conditions of distribution and use, see copyright notice in zlib.h |
4 */ | 4 */ |
5 | 5 |
6 /* | 6 /* |
7 * Change history: | 7 * Change history: |
8 * | 8 * |
9 * 1.2.beta0 24 Nov 2002 | 9 * 1.2.beta0 24 Nov 2002 |
10 * - First version -- complete rewrite of inflate to simplify code, avoid | 10 * - First version -- complete rewrite of inflate to simplify code, avoid |
11 * creation of window when not needed, minimize use of window when it is | 11 * creation of window when not needed, minimize use of window when it is |
12 * needed, make inffast.c even faster, implement gzip decoding, and to | 12 * needed, make inffast.c even faster, implement gzip decoding, and to |
(...skipping 25 matching lines...) Expand all Loading... |
38 * - Use local copies of stream next and avail values, as well as local bit | 38 * - Use local copies of stream next and avail values, as well as local bit |
39 * buffer and bit count in inflate()--for speed when inflate_fast() not used | 39 * buffer and bit count in inflate()--for speed when inflate_fast() not used |
40 * | 40 * |
41 * 1.2.beta4 1 Jan 2003 | 41 * 1.2.beta4 1 Jan 2003 |
42 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings | 42 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings |
43 * - Move a comment on output buffer sizes from inffast.c to inflate.c | 43 * - Move a comment on output buffer sizes from inffast.c to inflate.c |
44 * - Add comments in inffast.c to introduce the inflate_fast() routine | 44 * - Add comments in inffast.c to introduce the inflate_fast() routine |
45 * - Rearrange window copies in inflate_fast() for speed and simplification | 45 * - Rearrange window copies in inflate_fast() for speed and simplification |
46 * - Unroll last copy for window match in inflate_fast() | 46 * - Unroll last copy for window match in inflate_fast() |
47 * - Use local copies of window variables in inflate_fast() for speed | 47 * - Use local copies of window variables in inflate_fast() for speed |
48 * - Pull out common write == 0 case for speed in inflate_fast() | 48 * - Pull out common wnext == 0 case for speed in inflate_fast() |
49 * - Make op and len in inflate_fast() unsigned for consistency | 49 * - Make op and len in inflate_fast() unsigned for consistency |
50 * - Add FAR to lcode and dcode declarations in inflate_fast() | 50 * - Add FAR to lcode and dcode declarations in inflate_fast() |
51 * - Simplified bad distance check in inflate_fast() | 51 * - Simplified bad distance check in inflate_fast() |
52 * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new | 52 * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new |
53 * source file infback.c to provide a call-back interface to inflate for | 53 * source file infback.c to provide a call-back interface to inflate for |
54 * programs like gzip and unzip -- uses window as output buffer to avoid | 54 * programs like gzip and unzip -- uses window as output buffer to avoid |
55 * window copying | 55 * window copying |
56 * | 56 * |
57 * 1.2.beta5 1 Jan 2003 | 57 * 1.2.beta5 1 Jan 2003 |
58 * - Improved inflateBack() interface to allow the caller to provide initial | 58 * - Improved inflateBack() interface to allow the caller to provide initial |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 strm->total_in = strm->total_out = state->total = 0; | 110 strm->total_in = strm->total_out = state->total = 0; |
111 strm->msg = Z_NULL; | 111 strm->msg = Z_NULL; |
112 strm->adler = 1; /* to support ill-conceived Java test suite */ | 112 strm->adler = 1; /* to support ill-conceived Java test suite */ |
113 state->mode = HEAD; | 113 state->mode = HEAD; |
114 state->last = 0; | 114 state->last = 0; |
115 state->havedict = 0; | 115 state->havedict = 0; |
116 state->dmax = 32768U; | 116 state->dmax = 32768U; |
117 state->head = Z_NULL; | 117 state->head = Z_NULL; |
118 state->wsize = 0; | 118 state->wsize = 0; |
119 state->whave = 0; | 119 state->whave = 0; |
120 state->write = 0; | 120 state->wnext = 0; |
121 state->hold = 0; | 121 state->hold = 0; |
122 state->bits = 0; | 122 state->bits = 0; |
123 state->lencode = state->distcode = state->next = state->codes; | 123 state->lencode = state->distcode = state->next = state->codes; |
| 124 state->sane = 1; |
| 125 state->back = -1; |
124 Tracev((stderr, "inflate: reset\n")); | 126 Tracev((stderr, "inflate: reset\n")); |
125 return Z_OK; | 127 return Z_OK; |
126 } | 128 } |
127 | 129 |
128 int ZEXPORT inflatePrime(strm, bits, value) | 130 int ZEXPORT inflateReset2(strm, windowBits) |
129 z_streamp strm; | 131 z_streamp strm; |
130 int bits; | 132 int windowBits; |
131 int value; | |
132 { | 133 { |
| 134 int wrap; |
133 struct inflate_state FAR *state; | 135 struct inflate_state FAR *state; |
134 | 136 |
| 137 /* get the state */ |
135 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; | 138 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; |
136 state = (struct inflate_state FAR *)strm->state; | 139 state = (struct inflate_state FAR *)strm->state; |
137 if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; | 140 |
138 value &= (1L << bits) - 1; | 141 /* extract wrap request from windowBits parameter */ |
139 state->hold += value << state->bits; | 142 if (windowBits < 0) { |
140 state->bits += bits; | 143 wrap = 0; |
141 return Z_OK; | 144 windowBits = -windowBits; |
| 145 } |
| 146 else { |
| 147 wrap = (windowBits >> 4) + 1; |
| 148 #ifdef GUNZIP |
| 149 if (windowBits < 48) |
| 150 windowBits &= 15; |
| 151 #endif |
| 152 } |
| 153 |
| 154 /* set number of window bits, free window if different */ |
| 155 if (windowBits && (windowBits < 8 || windowBits > 15)) |
| 156 return Z_STREAM_ERROR; |
| 157 if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { |
| 158 ZFREE(strm, state->window); |
| 159 state->window = Z_NULL; |
| 160 } |
| 161 |
| 162 /* update state and reset the rest of it */ |
| 163 state->wrap = wrap; |
| 164 state->wbits = (unsigned)windowBits; |
| 165 return inflateReset(strm); |
142 } | 166 } |
143 | 167 |
144 int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) | 168 int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) |
145 z_streamp strm; | 169 z_streamp strm; |
146 int windowBits; | 170 int windowBits; |
147 const char *version; | 171 const char *version; |
148 int stream_size; | 172 int stream_size; |
149 { | 173 { |
| 174 int ret; |
150 struct inflate_state FAR *state; | 175 struct inflate_state FAR *state; |
151 | 176 |
152 if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || | 177 if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || |
153 stream_size != (int)(sizeof(z_stream))) | 178 stream_size != (int)(sizeof(z_stream))) |
154 return Z_VERSION_ERROR; | 179 return Z_VERSION_ERROR; |
155 if (strm == Z_NULL) return Z_STREAM_ERROR; | 180 if (strm == Z_NULL) return Z_STREAM_ERROR; |
156 strm->msg = Z_NULL; /* in case we return an error */ | 181 strm->msg = Z_NULL; /* in case we return an error */ |
157 if (strm->zalloc == (alloc_func)0) { | 182 if (strm->zalloc == (alloc_func)0) { |
158 strm->zalloc = zcalloc; | 183 strm->zalloc = zcalloc; |
159 strm->opaque = (voidpf)0; | 184 strm->opaque = (voidpf)0; |
160 } | 185 } |
161 if (strm->zfree == (free_func)0) strm->zfree = zcfree; | 186 if (strm->zfree == (free_func)0) strm->zfree = zcfree; |
162 state = (struct inflate_state FAR *) | 187 state = (struct inflate_state FAR *) |
163 ZALLOC(strm, 1, sizeof(struct inflate_state)); | 188 ZALLOC(strm, 1, sizeof(struct inflate_state)); |
164 if (state == Z_NULL) return Z_MEM_ERROR; | 189 if (state == Z_NULL) return Z_MEM_ERROR; |
165 Tracev((stderr, "inflate: allocated\n")); | 190 Tracev((stderr, "inflate: allocated\n")); |
166 strm->state = (struct internal_state FAR *)state; | 191 strm->state = (struct internal_state FAR *)state; |
167 if (windowBits < 0) { | 192 state->window = Z_NULL; |
168 state->wrap = 0; | 193 ret = inflateReset2(strm, windowBits); |
169 windowBits = -windowBits; | 194 if (ret != Z_OK) { |
170 } | |
171 else { | |
172 state->wrap = (windowBits >> 4) + 1; | |
173 #ifdef GUNZIP | |
174 if (windowBits < 48) windowBits &= 15; | |
175 #endif | |
176 } | |
177 if (windowBits < 8 || windowBits > 15) { | |
178 ZFREE(strm, state); | 195 ZFREE(strm, state); |
179 strm->state = Z_NULL; | 196 strm->state = Z_NULL; |
180 return Z_STREAM_ERROR; | |
181 } | 197 } |
182 state->wbits = (unsigned)windowBits; | 198 return ret; |
183 state->window = Z_NULL; | |
184 return inflateReset(strm); | |
185 } | 199 } |
186 | 200 |
187 int ZEXPORT inflateInit_(strm, version, stream_size) | 201 int ZEXPORT inflateInit_(strm, version, stream_size) |
188 z_streamp strm; | 202 z_streamp strm; |
189 const char *version; | 203 const char *version; |
190 int stream_size; | 204 int stream_size; |
191 { | 205 { |
192 return inflateInit2_(strm, DEF_WBITS, version, stream_size); | 206 return inflateInit2_(strm, DEF_WBITS, version, stream_size); |
193 } | 207 } |
194 | 208 |
| 209 int ZEXPORT inflatePrime(strm, bits, value) |
| 210 z_streamp strm; |
| 211 int bits; |
| 212 int value; |
| 213 { |
| 214 struct inflate_state FAR *state; |
| 215 |
| 216 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; |
| 217 state = (struct inflate_state FAR *)strm->state; |
| 218 if (bits < 0) { |
| 219 state->hold = 0; |
| 220 state->bits = 0; |
| 221 return Z_OK; |
| 222 } |
| 223 if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; |
| 224 value &= (1L << bits) - 1; |
| 225 state->hold += value << state->bits; |
| 226 state->bits += bits; |
| 227 return Z_OK; |
| 228 } |
| 229 |
195 /* | 230 /* |
196 Return state with length and distance decoding tables and index sizes set to | 231 Return state with length and distance decoding tables and index sizes set to |
197 fixed code decoding. Normally this returns fixed tables from inffixed.h. | 232 fixed code decoding. Normally this returns fixed tables from inffixed.h. |
198 If BUILDFIXED is defined, then instead this routine builds the tables the | 233 If BUILDFIXED is defined, then instead this routine builds the tables the |
199 first time it's called, and returns those tables the first time and | 234 first time it's called, and returns those tables the first time and |
200 thereafter. This reduces the size of the code by about 2K bytes, in | 235 thereafter. This reduces the size of the code by about 2K bytes, in |
201 exchange for a little execution time. However, BUILDFIXED should not be | 236 exchange for a little execution time. However, BUILDFIXED should not be |
202 used for threaded applications, since the rewriting of the tables and virgin | 237 used for threaded applications, since the rewriting of the tables and virgin |
203 may not be thread-safe. | 238 may not be thread-safe. |
204 */ | 239 */ |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 if (state->window == Z_NULL) { | 368 if (state->window == Z_NULL) { |
334 state->window = (unsigned char FAR *) | 369 state->window = (unsigned char FAR *) |
335 ZALLOC(strm, 1U << state->wbits, | 370 ZALLOC(strm, 1U << state->wbits, |
336 sizeof(unsigned char)); | 371 sizeof(unsigned char)); |
337 if (state->window == Z_NULL) return 1; | 372 if (state->window == Z_NULL) return 1; |
338 } | 373 } |
339 | 374 |
340 /* if window not in use yet, initialize */ | 375 /* if window not in use yet, initialize */ |
341 if (state->wsize == 0) { | 376 if (state->wsize == 0) { |
342 state->wsize = 1U << state->wbits; | 377 state->wsize = 1U << state->wbits; |
343 state->write = 0; | 378 state->wnext = 0; |
344 state->whave = 0; | 379 state->whave = 0; |
345 } | 380 } |
346 | 381 |
347 /* copy state->wsize or less output bytes into the circular window */ | 382 /* copy state->wsize or less output bytes into the circular window */ |
348 copy = out - strm->avail_out; | 383 copy = out - strm->avail_out; |
349 if (copy >= state->wsize) { | 384 if (copy >= state->wsize) { |
350 zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); | 385 zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); |
351 state->write = 0; | 386 state->wnext = 0; |
352 state->whave = state->wsize; | 387 state->whave = state->wsize; |
353 } | 388 } |
354 else { | 389 else { |
355 dist = state->wsize - state->write; | 390 dist = state->wsize - state->wnext; |
356 if (dist > copy) dist = copy; | 391 if (dist > copy) dist = copy; |
357 zmemcpy(state->window + state->write, strm->next_out - copy, dist); | 392 zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); |
358 copy -= dist; | 393 copy -= dist; |
359 if (copy) { | 394 if (copy) { |
360 zmemcpy(state->window, strm->next_out - copy, copy); | 395 zmemcpy(state->window, strm->next_out - copy, copy); |
361 state->write = copy; | 396 state->wnext = copy; |
362 state->whave = state->wsize; | 397 state->whave = state->wsize; |
363 } | 398 } |
364 else { | 399 else { |
365 state->write += dist; | 400 state->wnext += dist; |
366 if (state->write == state->wsize) state->write = 0; | 401 if (state->wnext == state->wsize) state->wnext = 0; |
367 if (state->whave < state->wsize) state->whave += dist; | 402 if (state->whave < state->wsize) state->whave += dist; |
368 } | 403 } |
369 } | 404 } |
370 return 0; | 405 return 0; |
371 } | 406 } |
372 | 407 |
373 /* Macros for inflate(): */ | 408 /* Macros for inflate(): */ |
374 | 409 |
375 /* check function to use adler32() for zlib or crc32() for gzip */ | 410 /* check function to use adler32() for zlib or crc32() for gzip */ |
376 #ifdef GUNZIP | 411 #ifdef GUNZIP |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
557 { | 592 { |
558 struct inflate_state FAR *state; | 593 struct inflate_state FAR *state; |
559 unsigned char FAR *next; /* next input */ | 594 unsigned char FAR *next; /* next input */ |
560 unsigned char FAR *put; /* next output */ | 595 unsigned char FAR *put; /* next output */ |
561 unsigned have, left; /* available input and output */ | 596 unsigned have, left; /* available input and output */ |
562 unsigned long hold; /* bit buffer */ | 597 unsigned long hold; /* bit buffer */ |
563 unsigned bits; /* bits in bit buffer */ | 598 unsigned bits; /* bits in bit buffer */ |
564 unsigned in, out; /* save starting available input and output */ | 599 unsigned in, out; /* save starting available input and output */ |
565 unsigned copy; /* number of stored or match bytes to copy */ | 600 unsigned copy; /* number of stored or match bytes to copy */ |
566 unsigned char FAR *from; /* where to copy match bytes from */ | 601 unsigned char FAR *from; /* where to copy match bytes from */ |
567 code this; /* current decoding table entry */ | 602 code here; /* current decoding table entry */ |
568 code last; /* parent table entry */ | 603 code last; /* parent table entry */ |
569 unsigned len; /* length to copy for repeats, bits to drop */ | 604 unsigned len; /* length to copy for repeats, bits to drop */ |
570 int ret; /* return code */ | 605 int ret; /* return code */ |
571 #ifdef GUNZIP | 606 #ifdef GUNZIP |
572 unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ | 607 unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ |
573 #endif | 608 #endif |
574 static const unsigned short order[19] = /* permutation of code lengths */ | 609 static const unsigned short order[19] = /* permutation of code lengths */ |
575 {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; | 610 {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; |
576 | 611 |
577 if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || | 612 if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 state->mode = BAD; | 647 state->mode = BAD; |
613 break; | 648 break; |
614 } | 649 } |
615 if (BITS(4) != Z_DEFLATED) { | 650 if (BITS(4) != Z_DEFLATED) { |
616 strm->msg = (char *)"unknown compression method"; | 651 strm->msg = (char *)"unknown compression method"; |
617 state->mode = BAD; | 652 state->mode = BAD; |
618 break; | 653 break; |
619 } | 654 } |
620 DROPBITS(4); | 655 DROPBITS(4); |
621 len = BITS(4) + 8; | 656 len = BITS(4) + 8; |
622 if (len > state->wbits) { | 657 if (state->wbits == 0) |
| 658 state->wbits = len; |
| 659 else if (len > state->wbits) { |
623 strm->msg = (char *)"invalid window size"; | 660 strm->msg = (char *)"invalid window size"; |
624 state->mode = BAD; | 661 state->mode = BAD; |
625 break; | 662 break; |
626 } | 663 } |
627 state->dmax = 1U << len; | 664 state->dmax = 1U << len; |
628 Tracev((stderr, "inflate: zlib header ok\n")); | 665 Tracev((stderr, "inflate: zlib header ok\n")); |
629 strm->adler = state->check = adler32(0L, Z_NULL, 0); | 666 strm->adler = state->check = adler32(0L, Z_NULL, 0); |
630 state->mode = hold & 0x200 ? DICTID : TYPE; | 667 state->mode = hold & 0x200 ? DICTID : TYPE; |
631 INITBITS(); | 668 INITBITS(); |
632 break; | 669 break; |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
764 INITBITS(); | 801 INITBITS(); |
765 state->mode = DICT; | 802 state->mode = DICT; |
766 case DICT: | 803 case DICT: |
767 if (state->havedict == 0) { | 804 if (state->havedict == 0) { |
768 RESTORE(); | 805 RESTORE(); |
769 return Z_NEED_DICT; | 806 return Z_NEED_DICT; |
770 } | 807 } |
771 strm->adler = state->check = adler32(0L, Z_NULL, 0); | 808 strm->adler = state->check = adler32(0L, Z_NULL, 0); |
772 state->mode = TYPE; | 809 state->mode = TYPE; |
773 case TYPE: | 810 case TYPE: |
774 if (flush == Z_BLOCK) goto inf_leave; | 811 if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; |
775 case TYPEDO: | 812 case TYPEDO: |
776 if (state->last) { | 813 if (state->last) { |
777 BYTEBITS(); | 814 BYTEBITS(); |
778 state->mode = CHECK; | 815 state->mode = CHECK; |
779 break; | 816 break; |
780 } | 817 } |
781 NEEDBITS(3); | 818 NEEDBITS(3); |
782 state->last = BITS(1); | 819 state->last = BITS(1); |
783 DROPBITS(1); | 820 DROPBITS(1); |
784 switch (BITS(2)) { | 821 switch (BITS(2)) { |
785 case 0: /* stored block */ | 822 case 0: /* stored block */ |
786 Tracev((stderr, "inflate: stored block%s\n", | 823 Tracev((stderr, "inflate: stored block%s\n", |
787 state->last ? " (last)" : "")); | 824 state->last ? " (last)" : "")); |
788 state->mode = STORED; | 825 state->mode = STORED; |
789 break; | 826 break; |
790 case 1: /* fixed block */ | 827 case 1: /* fixed block */ |
791 fixedtables(state); | 828 fixedtables(state); |
792 Tracev((stderr, "inflate: fixed codes block%s\n", | 829 Tracev((stderr, "inflate: fixed codes block%s\n", |
793 state->last ? " (last)" : "")); | 830 state->last ? " (last)" : "")); |
794 state->mode = LEN; /* decode codes */ | 831 state->mode = LEN_; /* decode codes */ |
| 832 if (flush == Z_TREES) { |
| 833 DROPBITS(2); |
| 834 goto inf_leave; |
| 835 } |
795 break; | 836 break; |
796 case 2: /* dynamic block */ | 837 case 2: /* dynamic block */ |
797 Tracev((stderr, "inflate: dynamic codes block%s\n", | 838 Tracev((stderr, "inflate: dynamic codes block%s\n", |
798 state->last ? " (last)" : "")); | 839 state->last ? " (last)" : "")); |
799 state->mode = TABLE; | 840 state->mode = TABLE; |
800 break; | 841 break; |
801 case 3: | 842 case 3: |
802 strm->msg = (char *)"invalid block type"; | 843 strm->msg = (char *)"invalid block type"; |
803 state->mode = BAD; | 844 state->mode = BAD; |
804 } | 845 } |
805 DROPBITS(2); | 846 DROPBITS(2); |
806 break; | 847 break; |
807 case STORED: | 848 case STORED: |
808 BYTEBITS(); /* go to byte boundary */ | 849 BYTEBITS(); /* go to byte boundary */ |
809 NEEDBITS(32); | 850 NEEDBITS(32); |
810 if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { | 851 if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { |
811 strm->msg = (char *)"invalid stored block lengths"; | 852 strm->msg = (char *)"invalid stored block lengths"; |
812 state->mode = BAD; | 853 state->mode = BAD; |
813 break; | 854 break; |
814 } | 855 } |
815 state->length = (unsigned)hold & 0xffff; | 856 state->length = (unsigned)hold & 0xffff; |
816 Tracev((stderr, "inflate: stored length %u\n", | 857 Tracev((stderr, "inflate: stored length %u\n", |
817 state->length)); | 858 state->length)); |
818 INITBITS(); | 859 INITBITS(); |
| 860 state->mode = COPY_; |
| 861 if (flush == Z_TREES) goto inf_leave; |
| 862 case COPY_: |
819 state->mode = COPY; | 863 state->mode = COPY; |
820 case COPY: | 864 case COPY: |
821 copy = state->length; | 865 copy = state->length; |
822 if (copy) { | 866 if (copy) { |
823 if (copy > have) copy = have; | 867 if (copy > have) copy = have; |
824 if (copy > left) copy = left; | 868 if (copy > left) copy = left; |
825 if (copy == 0) goto inf_leave; | 869 if (copy == 0) goto inf_leave; |
826 zmemcpy(put, next, copy); | 870 zmemcpy(put, next, copy); |
827 have -= copy; | 871 have -= copy; |
828 next += copy; | 872 next += copy; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
869 strm->msg = (char *)"invalid code lengths set"; | 913 strm->msg = (char *)"invalid code lengths set"; |
870 state->mode = BAD; | 914 state->mode = BAD; |
871 break; | 915 break; |
872 } | 916 } |
873 Tracev((stderr, "inflate: code lengths ok\n")); | 917 Tracev((stderr, "inflate: code lengths ok\n")); |
874 state->have = 0; | 918 state->have = 0; |
875 state->mode = CODELENS; | 919 state->mode = CODELENS; |
876 case CODELENS: | 920 case CODELENS: |
877 while (state->have < state->nlen + state->ndist) { | 921 while (state->have < state->nlen + state->ndist) { |
878 for (;;) { | 922 for (;;) { |
879 this = state->lencode[BITS(state->lenbits)]; | 923 here = state->lencode[BITS(state->lenbits)]; |
880 if ((unsigned)(this.bits) <= bits) break; | 924 if ((unsigned)(here.bits) <= bits) break; |
881 PULLBYTE(); | 925 PULLBYTE(); |
882 } | 926 } |
883 if (this.val < 16) { | 927 if (here.val < 16) { |
884 NEEDBITS(this.bits); | 928 NEEDBITS(here.bits); |
885 DROPBITS(this.bits); | 929 DROPBITS(here.bits); |
886 state->lens[state->have++] = this.val; | 930 state->lens[state->have++] = here.val; |
887 } | 931 } |
888 else { | 932 else { |
889 if (this.val == 16) { | 933 if (here.val == 16) { |
890 NEEDBITS(this.bits + 2); | 934 NEEDBITS(here.bits + 2); |
891 DROPBITS(this.bits); | 935 DROPBITS(here.bits); |
892 if (state->have == 0) { | 936 if (state->have == 0) { |
893 strm->msg = (char *)"invalid bit length repeat"; | 937 strm->msg = (char *)"invalid bit length repeat"; |
894 state->mode = BAD; | 938 state->mode = BAD; |
895 break; | 939 break; |
896 } | 940 } |
897 len = state->lens[state->have - 1]; | 941 len = state->lens[state->have - 1]; |
898 copy = 3 + BITS(2); | 942 copy = 3 + BITS(2); |
899 DROPBITS(2); | 943 DROPBITS(2); |
900 } | 944 } |
901 else if (this.val == 17) { | 945 else if (here.val == 17) { |
902 NEEDBITS(this.bits + 3); | 946 NEEDBITS(here.bits + 3); |
903 DROPBITS(this.bits); | 947 DROPBITS(here.bits); |
904 len = 0; | 948 len = 0; |
905 copy = 3 + BITS(3); | 949 copy = 3 + BITS(3); |
906 DROPBITS(3); | 950 DROPBITS(3); |
907 } | 951 } |
908 else { | 952 else { |
909 NEEDBITS(this.bits + 7); | 953 NEEDBITS(here.bits + 7); |
910 DROPBITS(this.bits); | 954 DROPBITS(here.bits); |
911 len = 0; | 955 len = 0; |
912 copy = 11 + BITS(7); | 956 copy = 11 + BITS(7); |
913 DROPBITS(7); | 957 DROPBITS(7); |
914 } | 958 } |
915 if (state->have + copy > state->nlen + state->ndist) { | 959 if (state->have + copy > state->nlen + state->ndist) { |
916 strm->msg = (char *)"invalid bit length repeat"; | 960 strm->msg = (char *)"invalid bit length repeat"; |
917 state->mode = BAD; | 961 state->mode = BAD; |
918 break; | 962 break; |
919 } | 963 } |
920 while (copy--) | 964 while (copy--) |
921 state->lens[state->have++] = (unsigned short)len; | 965 state->lens[state->have++] = (unsigned short)len; |
922 } | 966 } |
923 } | 967 } |
924 | 968 |
925 /* handle error breaks in while */ | 969 /* handle error breaks in while */ |
926 if (state->mode == BAD) break; | 970 if (state->mode == BAD) break; |
927 | 971 |
928 /* build code tables */ | 972 /* check for end-of-block code (better have one) */ |
| 973 if (state->lens[256] == 0) { |
| 974 strm->msg = (char *)"invalid code -- missing end-of-block"; |
| 975 state->mode = BAD; |
| 976 break; |
| 977 } |
| 978 |
| 979 /* build code tables -- note: do not change the lenbits or distbits |
| 980 values here (9 and 6) without reading the comments in inftrees.h |
| 981 concerning the ENOUGH constants, which depend on those values */ |
929 state->next = state->codes; | 982 state->next = state->codes; |
930 state->lencode = (code const FAR *)(state->next); | 983 state->lencode = (code const FAR *)(state->next); |
931 state->lenbits = 9; | 984 state->lenbits = 9; |
932 ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), | 985 ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), |
933 &(state->lenbits), state->work); | 986 &(state->lenbits), state->work); |
934 if (ret) { | 987 if (ret) { |
935 strm->msg = (char *)"invalid literal/lengths set"; | 988 strm->msg = (char *)"invalid literal/lengths set"; |
936 state->mode = BAD; | 989 state->mode = BAD; |
937 break; | 990 break; |
938 } | 991 } |
939 state->distcode = (code const FAR *)(state->next); | 992 state->distcode = (code const FAR *)(state->next); |
940 state->distbits = 6; | 993 state->distbits = 6; |
941 ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, | 994 ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, |
942 &(state->next), &(state->distbits), state->work); | 995 &(state->next), &(state->distbits), state->work); |
943 if (ret) { | 996 if (ret) { |
944 strm->msg = (char *)"invalid distances set"; | 997 strm->msg = (char *)"invalid distances set"; |
945 state->mode = BAD; | 998 state->mode = BAD; |
946 break; | 999 break; |
947 } | 1000 } |
948 Tracev((stderr, "inflate: codes ok\n")); | 1001 Tracev((stderr, "inflate: codes ok\n")); |
| 1002 state->mode = LEN_; |
| 1003 if (flush == Z_TREES) goto inf_leave; |
| 1004 case LEN_: |
949 state->mode = LEN; | 1005 state->mode = LEN; |
950 case LEN: | 1006 case LEN: |
951 if (have >= 6 && left >= 258) { | 1007 if (have >= 6 && left >= 258) { |
952 RESTORE(); | 1008 RESTORE(); |
953 inflate_fast(strm, out); | 1009 inflate_fast(strm, out); |
954 LOAD(); | 1010 LOAD(); |
| 1011 if (state->mode == TYPE) |
| 1012 state->back = -1; |
955 break; | 1013 break; |
956 } | 1014 } |
| 1015 state->back = 0; |
957 for (;;) { | 1016 for (;;) { |
958 this = state->lencode[BITS(state->lenbits)]; | 1017 here = state->lencode[BITS(state->lenbits)]; |
959 if ((unsigned)(this.bits) <= bits) break; | 1018 if ((unsigned)(here.bits) <= bits) break; |
960 PULLBYTE(); | 1019 PULLBYTE(); |
961 } | 1020 } |
962 if (this.op && (this.op & 0xf0) == 0) { | 1021 if (here.op && (here.op & 0xf0) == 0) { |
963 last = this; | 1022 last = here; |
964 for (;;) { | 1023 for (;;) { |
965 this = state->lencode[last.val + | 1024 here = state->lencode[last.val + |
966 (BITS(last.bits + last.op) >> last.bits)]; | 1025 (BITS(last.bits + last.op) >> last.bits)]; |
967 if ((unsigned)(last.bits + this.bits) <= bits) break; | 1026 if ((unsigned)(last.bits + here.bits) <= bits) break; |
968 PULLBYTE(); | 1027 PULLBYTE(); |
969 } | 1028 } |
970 DROPBITS(last.bits); | 1029 DROPBITS(last.bits); |
| 1030 state->back += last.bits; |
971 } | 1031 } |
972 DROPBITS(this.bits); | 1032 DROPBITS(here.bits); |
973 state->length = (unsigned)this.val; | 1033 state->back += here.bits; |
974 if ((int)(this.op) == 0) { | 1034 state->length = (unsigned)here.val; |
975 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? | 1035 if ((int)(here.op) == 0) { |
| 1036 Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? |
976 "inflate: literal '%c'\n" : | 1037 "inflate: literal '%c'\n" : |
977 "inflate: literal 0x%02x\n", this.val)); | 1038 "inflate: literal 0x%02x\n", here.val)); |
978 state->mode = LIT; | 1039 state->mode = LIT; |
979 break; | 1040 break; |
980 } | 1041 } |
981 if (this.op & 32) { | 1042 if (here.op & 32) { |
982 Tracevv((stderr, "inflate: end of block\n")); | 1043 Tracevv((stderr, "inflate: end of block\n")); |
| 1044 state->back = -1; |
983 state->mode = TYPE; | 1045 state->mode = TYPE; |
984 break; | 1046 break; |
985 } | 1047 } |
986 if (this.op & 64) { | 1048 if (here.op & 64) { |
987 strm->msg = (char *)"invalid literal/length code"; | 1049 strm->msg = (char *)"invalid literal/length code"; |
988 state->mode = BAD; | 1050 state->mode = BAD; |
989 break; | 1051 break; |
990 } | 1052 } |
991 state->extra = (unsigned)(this.op) & 15; | 1053 state->extra = (unsigned)(here.op) & 15; |
992 state->mode = LENEXT; | 1054 state->mode = LENEXT; |
993 case LENEXT: | 1055 case LENEXT: |
994 if (state->extra) { | 1056 if (state->extra) { |
995 NEEDBITS(state->extra); | 1057 NEEDBITS(state->extra); |
996 state->length += BITS(state->extra); | 1058 state->length += BITS(state->extra); |
997 DROPBITS(state->extra); | 1059 DROPBITS(state->extra); |
| 1060 state->back += state->extra; |
998 } | 1061 } |
999 Tracevv((stderr, "inflate: length %u\n", state->length)); | 1062 Tracevv((stderr, "inflate: length %u\n", state->length)); |
| 1063 state->was = state->length; |
1000 state->mode = DIST; | 1064 state->mode = DIST; |
1001 case DIST: | 1065 case DIST: |
1002 for (;;) { | 1066 for (;;) { |
1003 this = state->distcode[BITS(state->distbits)]; | 1067 here = state->distcode[BITS(state->distbits)]; |
1004 if ((unsigned)(this.bits) <= bits) break; | 1068 if ((unsigned)(here.bits) <= bits) break; |
1005 PULLBYTE(); | 1069 PULLBYTE(); |
1006 } | 1070 } |
1007 if ((this.op & 0xf0) == 0) { | 1071 if ((here.op & 0xf0) == 0) { |
1008 last = this; | 1072 last = here; |
1009 for (;;) { | 1073 for (;;) { |
1010 this = state->distcode[last.val + | 1074 here = state->distcode[last.val + |
1011 (BITS(last.bits + last.op) >> last.bits)]; | 1075 (BITS(last.bits + last.op) >> last.bits)]; |
1012 if ((unsigned)(last.bits + this.bits) <= bits) break; | 1076 if ((unsigned)(last.bits + here.bits) <= bits) break; |
1013 PULLBYTE(); | 1077 PULLBYTE(); |
1014 } | 1078 } |
1015 DROPBITS(last.bits); | 1079 DROPBITS(last.bits); |
| 1080 state->back += last.bits; |
1016 } | 1081 } |
1017 DROPBITS(this.bits); | 1082 DROPBITS(here.bits); |
1018 if (this.op & 64) { | 1083 state->back += here.bits; |
| 1084 if (here.op & 64) { |
1019 strm->msg = (char *)"invalid distance code"; | 1085 strm->msg = (char *)"invalid distance code"; |
1020 state->mode = BAD; | 1086 state->mode = BAD; |
1021 break; | 1087 break; |
1022 } | 1088 } |
1023 state->offset = (unsigned)this.val; | 1089 state->offset = (unsigned)here.val; |
1024 state->extra = (unsigned)(this.op) & 15; | 1090 state->extra = (unsigned)(here.op) & 15; |
1025 state->mode = DISTEXT; | 1091 state->mode = DISTEXT; |
1026 case DISTEXT: | 1092 case DISTEXT: |
1027 if (state->extra) { | 1093 if (state->extra) { |
1028 NEEDBITS(state->extra); | 1094 NEEDBITS(state->extra); |
1029 state->offset += BITS(state->extra); | 1095 state->offset += BITS(state->extra); |
1030 DROPBITS(state->extra); | 1096 DROPBITS(state->extra); |
| 1097 state->back += state->extra; |
1031 } | 1098 } |
1032 #ifdef INFLATE_STRICT | 1099 #ifdef INFLATE_STRICT |
1033 if (state->offset > state->dmax) { | 1100 if (state->offset > state->dmax) { |
1034 strm->msg = (char *)"invalid distance too far back"; | 1101 strm->msg = (char *)"invalid distance too far back"; |
1035 state->mode = BAD; | 1102 state->mode = BAD; |
1036 break; | 1103 break; |
1037 } | 1104 } |
1038 #endif | 1105 #endif |
1039 if (state->offset > state->whave + out - left) { | |
1040 strm->msg = (char *)"invalid distance too far back"; | |
1041 state->mode = BAD; | |
1042 break; | |
1043 } | |
1044 Tracevv((stderr, "inflate: distance %u\n", state->offset)); | 1106 Tracevv((stderr, "inflate: distance %u\n", state->offset)); |
1045 state->mode = MATCH; | 1107 state->mode = MATCH; |
1046 case MATCH: | 1108 case MATCH: |
1047 if (left == 0) goto inf_leave; | 1109 if (left == 0) goto inf_leave; |
1048 copy = out - left; | 1110 copy = out - left; |
1049 if (state->offset > copy) { /* copy from window */ | 1111 if (state->offset > copy) { /* copy from window */ |
1050 copy = state->offset - copy; | 1112 copy = state->offset - copy; |
1051 if (copy > state->write) { | 1113 if (copy > state->whave) { |
1052 copy -= state->write; | 1114 if (state->sane) { |
| 1115 strm->msg = (char *)"invalid distance too far back"; |
| 1116 state->mode = BAD; |
| 1117 break; |
| 1118 } |
| 1119 #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR |
| 1120 Trace((stderr, "inflate.c too far\n")); |
| 1121 copy -= state->whave; |
| 1122 if (copy > state->length) copy = state->length; |
| 1123 if (copy > left) copy = left; |
| 1124 left -= copy; |
| 1125 state->length -= copy; |
| 1126 do { |
| 1127 *put++ = 0; |
| 1128 } while (--copy); |
| 1129 if (state->length == 0) state->mode = LEN; |
| 1130 break; |
| 1131 #endif |
| 1132 } |
| 1133 if (copy > state->wnext) { |
| 1134 copy -= state->wnext; |
1053 from = state->window + (state->wsize - copy); | 1135 from = state->window + (state->wsize - copy); |
1054 } | 1136 } |
1055 else | 1137 else |
1056 from = state->window + (state->write - copy); | 1138 from = state->window + (state->wnext - copy); |
1057 if (copy > state->length) copy = state->length; | 1139 if (copy > state->length) copy = state->length; |
1058 } | 1140 } |
1059 else { /* copy from output */ | 1141 else { /* copy from output */ |
1060 from = put - state->offset; | 1142 from = put - state->offset; |
1061 copy = state->length; | 1143 copy = state->length; |
1062 } | 1144 } |
1063 if (copy > left) copy = left; | 1145 if (copy > left) copy = left; |
1064 left -= copy; | 1146 left -= copy; |
1065 state->length -= copy; | 1147 state->length -= copy; |
1066 do { | 1148 do { |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1139 } | 1221 } |
1140 in -= strm->avail_in; | 1222 in -= strm->avail_in; |
1141 out -= strm->avail_out; | 1223 out -= strm->avail_out; |
1142 strm->total_in += in; | 1224 strm->total_in += in; |
1143 strm->total_out += out; | 1225 strm->total_out += out; |
1144 state->total += out; | 1226 state->total += out; |
1145 if (state->wrap && out) | 1227 if (state->wrap && out) |
1146 strm->adler = state->check = | 1228 strm->adler = state->check = |
1147 UPDATE(state->check, strm->next_out - out, out); | 1229 UPDATE(state->check, strm->next_out - out, out); |
1148 strm->data_type = state->bits + (state->last ? 64 : 0) + | 1230 strm->data_type = state->bits + (state->last ? 64 : 0) + |
1149 (state->mode == TYPE ? 128 : 0); | 1231 (state->mode == TYPE ? 128 : 0) + |
| 1232 (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); |
1150 if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) | 1233 if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) |
1151 ret = Z_BUF_ERROR; | 1234 ret = Z_BUF_ERROR; |
1152 return ret; | 1235 return ret; |
1153 } | 1236 } |
1154 | 1237 |
1155 int ZEXPORT inflateEnd(strm) | 1238 int ZEXPORT inflateEnd(strm) |
1156 z_streamp strm; | 1239 z_streamp strm; |
1157 { | 1240 { |
1158 struct inflate_state FAR *state; | 1241 struct inflate_state FAR *state; |
1159 if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) | 1242 if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1359 } | 1442 } |
1360 copy->next = copy->codes + (state->next - state->codes); | 1443 copy->next = copy->codes + (state->next - state->codes); |
1361 if (window != Z_NULL) { | 1444 if (window != Z_NULL) { |
1362 wsize = 1U << state->wbits; | 1445 wsize = 1U << state->wbits; |
1363 zmemcpy(window, state->window, wsize); | 1446 zmemcpy(window, state->window, wsize); |
1364 } | 1447 } |
1365 copy->window = window; | 1448 copy->window = window; |
1366 dest->state = (struct internal_state FAR *)copy; | 1449 dest->state = (struct internal_state FAR *)copy; |
1367 return Z_OK; | 1450 return Z_OK; |
1368 } | 1451 } |
| 1452 |
| 1453 int ZEXPORT inflateUndermine(strm, subvert) |
| 1454 z_streamp strm; |
| 1455 int subvert; |
| 1456 { |
| 1457 struct inflate_state FAR *state; |
| 1458 |
| 1459 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; |
| 1460 state = (struct inflate_state FAR *)strm->state; |
| 1461 state->sane = !subvert; |
| 1462 #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR |
| 1463 return Z_OK; |
| 1464 #else |
| 1465 state->sane = 1; |
| 1466 return Z_DATA_ERROR; |
| 1467 #endif |
| 1468 } |
| 1469 |
| 1470 long ZEXPORT inflateMark(strm) |
| 1471 z_streamp strm; |
| 1472 { |
| 1473 struct inflate_state FAR *state; |
| 1474 |
| 1475 if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; |
| 1476 state = (struct inflate_state FAR *)strm->state; |
| 1477 return ((long)(state->back) << 16) + |
| 1478 (state->mode == COPY ? state->length : |
| 1479 (state->mode == MATCH ? state->was - state->length : 0)); |
| 1480 } |
OLD | NEW |