inflate.c revision 1.3 1 /* $NetBSD: inflate.c,v 1.3 2006/05/13 22:05:04 christos Exp $ */
2
3 /* inflate.c -- zlib decompression
4 * Copyright (C) 1995-2005 Mark Adler
5 * For conditions of distribution and use, see copyright notice in zlib.h
6 */
7
8 /*
9 * Change history:
10 *
11 * 1.2.beta0 24 Nov 2002
12 * - First version -- complete rewrite of inflate to simplify code, avoid
13 * creation of window when not needed, minimize use of window when it is
14 * needed, make inffast.c even faster, implement gzip decoding, and to
15 * improve code readability and style over the previous zlib inflate code
16 *
17 * 1.2.beta1 25 Nov 2002
18 * - Use pointers for available input and output checking in inffast.c
19 * - Remove input and output counters in inffast.c
20 * - Change inffast.c entry and loop from avail_in >= 7 to >= 6
21 * - Remove unnecessary second byte pull from length extra in inffast.c
22 * - Unroll direct copy to three copies per loop in inffast.c
23 *
24 * 1.2.beta2 4 Dec 2002
25 * - Change external routine names to reduce potential conflicts
26 * - Correct filename to inffixed.h for fixed tables in inflate.c
27 * - Make hbuf[] unsigned char to match parameter type in inflate.c
28 * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)
29 * to avoid negation problem on Alphas (64 bit) in inflate.c
30 *
31 * 1.2.beta3 22 Dec 2002
32 * - Add comments on state->bits assertion in inffast.c
33 * - Add comments on op field in inftrees.h
34 * - Fix bug in reuse of allocated window after inflateReset()
35 * - Remove bit fields--back to byte structure for speed
36 * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths
37 * - Change post-increments to pre-increments in inflate_fast(), PPC biased?
38 * - Add compile time option, POSTINC, to use post-increments instead (Intel?)
39 * - Make MATCH copy in inflate() much faster for when inflate_fast() not used
40 * - Use local copies of stream next and avail values, as well as local bit
41 * buffer and bit count in inflate()--for speed when inflate_fast() not used
42 *
43 * 1.2.beta4 1 Jan 2003
44 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings
45 * - Move a comment on output buffer sizes from inffast.c to inflate.c
46 * - Add comments in inffast.c to introduce the inflate_fast() routine
47 * - Rearrange window copies in inflate_fast() for speed and simplification
48 * - Unroll last copy for window match in inflate_fast()
49 * - Use local copies of window variables in inflate_fast() for speed
50 * - Pull out common write == 0 case for speed in inflate_fast()
51 * - Make op and len in inflate_fast() unsigned for consistency
52 * - Add FAR to lcode and dcode declarations in inflate_fast()
53 * - Simplified bad distance check in inflate_fast()
54 * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new
55 * source file infback.c to provide a call-back interface to inflate for
56 * programs like gzip and unzip -- uses window as output buffer to avoid
57 * window copying
58 *
59 * 1.2.beta5 1 Jan 2003
60 * - Improved inflateBack() interface to allow the caller to provide initial
61 * input in strm.
62 * - Fixed stored blocks bug in inflateBack()
63 *
64 * 1.2.beta6 4 Jan 2003
65 * - Added comments in inffast.c on effectiveness of POSTINC
66 * - Typecasting all around to reduce compiler warnings
67 * - Changed loops from while (1) or do {} while (1) to for (;;), again to
68 * make compilers happy
69 * - Changed type of window in inflateBackInit() to unsigned char *
70 *
71 * 1.2.beta7 27 Jan 2003
72 * - Changed many types to unsigned or unsigned short to avoid warnings
73 * - Added inflateCopy() function
74 *
75 * 1.2.0 9 Mar 2003
76 * - Changed inflateBack() interface to provide separate opaque descriptors
77 * for the in() and out() functions
78 * - Changed inflateBack() argument and in_func typedef to swap the length
79 * and buffer address return values for the input function
80 * - Check next_in and next_out for Z_NULL on entry to inflate()
81 *
82 * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.
83 */
84
85 #include "zutil.h"
86 #include "inftrees.h"
87 #include "inflate.h"
88 #include "inffast.h"
89
90 #ifdef MAKEFIXED
91 # ifndef BUILDFIXED
92 # define BUILDFIXED
93 # endif
94 #endif
95
96 /* function prototypes */
97 local void fixedtables OF((struct inflate_state FAR *state));
98 local int updatewindow OF((z_streamp strm, unsigned out));
99 #ifdef BUILDFIXED
100 void makefixed OF((void));
101 #endif
102 local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,
103 unsigned len));
104
105 int ZEXPORT inflateReset(strm)
106 z_streamp strm;
107 {
108 struct inflate_state FAR *state;
109
110 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
111 state = (struct inflate_state FAR *)strm->state;
112 strm->total_in = strm->total_out = state->total = 0;
113 strm->msg = Z_NULL;
114 strm->adler = 1; /* to support ill-conceived Java test suite */
115 state->mode = HEAD;
116 state->last = 0;
117 state->havedict = 0;
118 state->dmax = 32768U;
119 state->head = Z_NULL;
120 state->wsize = 0;
121 state->whave = 0;
122 state->write = 0;
123 state->hold = 0;
124 state->bits = 0;
125 state->lencode = state->distcode = state->next = state->codes;
126 Tracev((stderr, "inflate: reset\n"));
127 return Z_OK;
128 }
129
130 int ZEXPORT inflatePrime(strm, bits, value)
131 z_streamp strm;
132 int bits;
133 int value;
134 {
135 struct inflate_state FAR *state;
136
137 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
138 state = (struct inflate_state FAR *)strm->state;
139 if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR;
140 value &= (1L << bits) - 1;
141 state->hold += value << state->bits;
142 state->bits += bits;
143 return Z_OK;
144 }
145
146 int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
147 z_streamp strm;
148 int windowBits;
149 const char *version;
150 int stream_size;
151 {
152 struct inflate_state FAR *state;
153
154 if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
155 stream_size != (int)(sizeof(z_stream)))
156 return Z_VERSION_ERROR;
157 if (strm == Z_NULL) return Z_STREAM_ERROR;
158 strm->msg = Z_NULL; /* in case we return an error */
159 if (strm->zalloc == (alloc_func)0) {
160 strm->zalloc = zcalloc;
161 strm->opaque = (voidpf)0;
162 }
163 if (strm->zfree == (free_func)0) strm->zfree = zcfree;
164 state = (struct inflate_state FAR *)
165 ZALLOC(strm, 1, sizeof(struct inflate_state));
166 if (state == Z_NULL) return Z_MEM_ERROR;
167 Tracev((stderr, "inflate: allocated\n"));
168 strm->state = (struct internal_state FAR *)state;
169 if (windowBits < 0) {
170 state->wrap = 0;
171 windowBits = -windowBits;
172 }
173 else {
174 state->wrap = (windowBits >> 4) + 1;
175 #ifdef GUNZIP
176 if (windowBits < 48) windowBits &= 15;
177 #endif
178 }
179 if (windowBits < 8 || windowBits > 15) {
180 ZFREE(strm, state);
181 strm->state = Z_NULL;
182 return Z_STREAM_ERROR;
183 }
184 state->wbits = (unsigned)windowBits;
185 state->window = Z_NULL;
186 return inflateReset(strm);
187 }
188
189 int ZEXPORT inflateInit_(strm, version, stream_size)
190 z_streamp strm;
191 const char *version;
192 int stream_size;
193 {
194 return inflateInit2_(strm, DEF_WBITS, version, stream_size);
195 }
196
197 /*
198 Return state with length and distance decoding tables and index sizes set to
199 fixed code decoding. Normally this returns fixed tables from inffixed.h.
200 If BUILDFIXED is defined, then instead this routine builds the tables the
201 first time it's called, and returns those tables the first time and
202 thereafter. This reduces the size of the code by about 2K bytes, in
203 exchange for a little execution time. However, BUILDFIXED should not be
204 used for threaded applications, since the rewriting of the tables and virgin
205 may not be thread-safe.
206 */
207 local void fixedtables(state)
208 struct inflate_state FAR *state;
209 {
210 #ifdef BUILDFIXED
211 static int virgin = 1;
212 static code *lenfix, *distfix;
213 static code fixed[544];
214
215 /* build fixed huffman tables if first call (may not be thread safe) */
216 if (virgin) {
217 unsigned sym, bits;
218 static code *next;
219
220 /* literal/length table */
221 sym = 0;
222 while (sym < 144) state->lens[sym++] = 8;
223 while (sym < 256) state->lens[sym++] = 9;
224 while (sym < 280) state->lens[sym++] = 7;
225 while (sym < 288) state->lens[sym++] = 8;
226 next = fixed;
227 lenfix = next;
228 bits = 9;
229 inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
230
231 /* distance table */
232 sym = 0;
233 while (sym < 32) state->lens[sym++] = 5;
234 distfix = next;
235 bits = 5;
236 inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
237
238 /* do this just once */
239 virgin = 0;
240 }
241 #else /* !BUILDFIXED */
242 # include "inffixed.h"
243 #endif /* BUILDFIXED */
244 state->lencode = lenfix;
245 state->lenbits = 9;
246 state->distcode = distfix;
247 state->distbits = 5;
248 }
249
250 #ifdef MAKEFIXED
251 #include <stdio.h>
252
253 /*
254 Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also
255 defines BUILDFIXED, so the tables are built on the fly. makefixed() writes
256 those tables to stdout, which would be piped to inffixed.h. A small program
257 can simply call makefixed to do this:
258
259 void makefixed(void);
260
261 int main(void)
262 {
263 makefixed();
264 return 0;
265 }
266
267 Then that can be linked with zlib built with MAKEFIXED defined and run:
268
269 a.out > inffixed.h
270 */
271 void makefixed()
272 {
273 unsigned low, size;
274 struct inflate_state state;
275
276 fixedtables(&state);
277 puts(" /* inffixed.h -- table for decoding fixed codes");
278 puts(" * Generated automatically by makefixed().");
279 puts(" */");
280 puts("");
281 puts(" /* WARNING: this file should *not* be used by applications.");
282 puts(" It is part of the implementation of this library and is");
283 puts(" subject to change. Applications should only use zlib.h.");
284 puts(" */");
285 puts("");
286 size = 1U << 9;
287 printf(" static const code lenfix[%u] = {", size);
288 low = 0;
289 for (;;) {
290 if ((low % 7) == 0) printf("\n ");
291 printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits,
292 state.lencode[low].val);
293 if (++low == size) break;
294 putchar(',');
295 }
296 puts("\n };");
297 size = 1U << 5;
298 printf("\n static const code distfix[%u] = {", size);
299 low = 0;
300 for (;;) {
301 if ((low % 6) == 0) printf("\n ");
302 printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
303 state.distcode[low].val);
304 if (++low == size) break;
305 putchar(',');
306 }
307 puts("\n };");
308 }
309 #endif /* MAKEFIXED */
310
311 /*
312 Update the window with the last wsize (normally 32K) bytes written before
313 returning. If window does not exist yet, create it. This is only called
314 when a window is already in use, or when output has been written during this
315 inflate call, but the end of the deflate stream has not been reached yet.
316 It is also called to create a window for dictionary data when a dictionary
317 is loaded.
318
319 Providing output buffers larger than 32K to inflate() should provide a speed
320 advantage, since only the last 32K of output is copied to the sliding window
321 upon return from inflate(), and since all distances after the first 32K of
322 output will fall in the output data, making match copies simpler and faster.
323 The advantage may be dependent on the size of the processor's data caches.
324 */
325 local int updatewindow(strm, out)
326 z_streamp strm;
327 unsigned out;
328 {
329 struct inflate_state FAR *state;
330 unsigned copy, dist;
331
332 state = (struct inflate_state FAR *)strm->state;
333
334 /* if it hasn't been done already, allocate space for the window */
335 if (state->window == Z_NULL) {
336 state->window = (unsigned char FAR *)
337 ZALLOC(strm, 1U << state->wbits,
338 sizeof(unsigned char));
339 if (state->window == Z_NULL) return 1;
340 }
341
342 /* if window not in use yet, initialize */
343 if (state->wsize == 0) {
344 state->wsize = 1U << state->wbits;
345 state->write = 0;
346 state->whave = 0;
347 }
348
349 /* copy state->wsize or less output bytes into the circular window */
350 copy = out - strm->avail_out;
351 if (copy >= state->wsize) {
352 zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);
353 state->write = 0;
354 state->whave = state->wsize;
355 }
356 else {
357 dist = state->wsize - state->write;
358 if (dist > copy) dist = copy;
359 zmemcpy(state->window + state->write, strm->next_out - copy, dist);
360 copy -= dist;
361 if (copy) {
362 zmemcpy(state->window, strm->next_out - copy, copy);
363 state->write = copy;
364 state->whave = state->wsize;
365 }
366 else {
367 state->write += dist;
368 if (state->write == state->wsize) state->write = 0;
369 if (state->whave < state->wsize) state->whave += dist;
370 }
371 }
372 return 0;
373 }
374
375 /* Macros for inflate(): */
376
377 /* check function to use adler32() for zlib or crc32() for gzip */
378 #ifdef GUNZIP
379 # define UPDATE(check, buf, len) \
380 (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
381 #else
382 # define UPDATE(check, buf, len) adler32(check, buf, len)
383 #endif
384
385 /* check macros for header crc */
386 #ifdef GUNZIP
387 # define CRC2(check, word) \
388 do { \
389 hbuf[0] = (unsigned char)(word); \
390 hbuf[1] = (unsigned char)((word) >> 8); \
391 check = crc32(check, hbuf, 2); \
392 } while (0)
393
394 # define CRC4(check, word) \
395 do { \
396 hbuf[0] = (unsigned char)(word); \
397 hbuf[1] = (unsigned char)((word) >> 8); \
398 hbuf[2] = (unsigned char)((word) >> 16); \
399 hbuf[3] = (unsigned char)((word) >> 24); \
400 check = crc32(check, hbuf, 4); \
401 } while (0)
402 #endif
403
404 /* Load registers with state in inflate() for speed */
405 #define LOAD() \
406 do { \
407 put = strm->next_out; \
408 left = strm->avail_out; \
409 next = strm->next_in; \
410 have = strm->avail_in; \
411 hold = state->hold; \
412 bits = state->bits; \
413 } while (0)
414
415 /* Restore state from registers in inflate() */
416 #define RESTORE() \
417 do { \
418 strm->next_out = put; \
419 strm->avail_out = left; \
420 strm->next_in = next; \
421 strm->avail_in = have; \
422 state->hold = hold; \
423 state->bits = bits; \
424 } while (0)
425
426 /* Clear the input bit accumulator */
427 #define INITBITS() \
428 do { \
429 hold = 0; \
430 bits = 0; \
431 } while (0)
432
433 /* Get a byte of input into the bit accumulator, or return from inflate()
434 if there is no input available. */
435 #define PULLBYTE() \
436 do { \
437 if (have == 0) goto inf_leave; \
438 have--; \
439 hold += (unsigned long)(*next++) << bits; \
440 bits += 8; \
441 } while (0)
442
443 /* Assure that there are at least n bits in the bit accumulator. If there is
444 not enough available input to do that, then return from inflate(). */
445 #define NEEDBITS(n) \
446 do { \
447 while (bits < (unsigned)(n)) \
448 PULLBYTE(); \
449 } while (0)
450
451 /* Return the low n bits of the bit accumulator (n < 16) */
452 #define BITS(n) \
453 ((unsigned)hold & ((1U << (n)) - 1))
454
455 /* Remove n bits from the bit accumulator */
456 #define DROPBITS(n) \
457 do { \
458 hold >>= (n); \
459 bits -= (unsigned)(n); \
460 } while (0)
461
462 /* Remove zero to seven bits as needed to go to a byte boundary */
463 #define BYTEBITS() \
464 do { \
465 hold >>= bits & 7; \
466 bits -= bits & 7; \
467 } while (0)
468
469 /* Reverse the bytes in a 32-bit value */
470 #define REVERSE(q) \
471 ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
472 (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
473
474 /*
475 inflate() uses a state machine to process as much input data and generate as
476 much output data as possible before returning. The state machine is
477 structured roughly as follows:
478
479 for (;;) switch (state) {
480 ...
481 case STATEn:
482 if (not enough input data or output space to make progress)
483 return;
484 ... make progress ...
485 state = STATEm;
486 break;
487 ...
488 }
489
490 so when inflate() is called again, the same case is attempted again, and
491 if the appropriate resources are provided, the machine proceeds to the
492 next state. The NEEDBITS() macro is usually the way the state evaluates
493 whether it can proceed or should return. NEEDBITS() does the return if
494 the requested bits are not available. The typical use of the BITS macros
495 is:
496
497 NEEDBITS(n);
498 ... do something with BITS(n) ...
499 DROPBITS(n);
500
501 where NEEDBITS(n) either returns from inflate() if there isn't enough
502 input left to load n bits into the accumulator, or it continues. BITS(n)
503 gives the low n bits in the accumulator. When done, DROPBITS(n) drops
504 the low n bits off the accumulator. INITBITS() clears the accumulator
505 and sets the number of available bits to zero. BYTEBITS() discards just
506 enough bits to put the accumulator on a byte boundary. After BYTEBITS()
507 and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
508
509 NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
510 if there is no input available. The decoding of variable length codes uses
511 PULLBYTE() directly in order to pull just enough bytes to decode the next
512 code, and no more.
513
514 Some states loop until they get enough input, making sure that enough
515 state information is maintained to continue the loop where it left off
516 if NEEDBITS() returns in the loop. For example, want, need, and keep
517 would all have to actually be part of the saved state in case NEEDBITS()
518 returns:
519
520 case STATEw:
521 while (want < need) {
522 NEEDBITS(n);
523 keep[want++] = BITS(n);
524 DROPBITS(n);
525 }
526 state = STATEx;
527 case STATEx:
528
529 As shown above, if the next state is also the next case, then the break
530 is omitted.
531
532 A state may also return if there is not enough output space available to
533 complete that state. Those states are copying stored data, writing a
534 literal byte, and copying a matching string.
535
536 When returning, a "goto inf_leave" is used to update the total counters,
537 update the check value, and determine whether any progress has been made
538 during that inflate() call in order to return the proper return code.
539 Progress is defined as a change in either strm->avail_in or strm->avail_out.
540 When there is a window, goto inf_leave will update the window with the last
541 output written. If a goto inf_leave occurs in the middle of decompression
542 and there is no window currently, goto inf_leave will create one and copy
543 output to the window for the next call of inflate().
544
545 In this implementation, the flush parameter of inflate() only affects the
546 return code (per zlib.h). inflate() always writes as much as possible to
547 strm->next_out, given the space available and the provided input--the effect
548 documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers
549 the allocation of and copying into a sliding window until necessary, which
550 provides the effect documented in zlib.h for Z_FINISH when the entire input
551 stream available. So the only thing the flush parameter actually does is:
552 when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it
553 will return Z_BUF_ERROR if it has not reached the end of the stream.
554 */
555
556 int ZEXPORT inflate(strm, flush)
557 z_streamp strm;
558 int flush;
559 {
560 struct inflate_state FAR *state;
561 unsigned char FAR *next; /* next input */
562 unsigned char FAR *put; /* next output */
563 unsigned have, left; /* available input and output */
564 unsigned long hold; /* bit buffer */
565 unsigned bits; /* bits in bit buffer */
566 unsigned in, out; /* save starting available input and output */
567 unsigned copy; /* number of stored or match bytes to copy */
568 unsigned char FAR *from; /* where to copy match bytes from */
569 code this; /* current decoding table entry */
570 code last; /* parent table entry */
571 unsigned len; /* length to copy for repeats, bits to drop */
572 int ret; /* return code */
573 #ifdef GUNZIP
574 unsigned char hbuf[4]; /* buffer for gzip header crc calculation */
575 #endif
576 static const unsigned short order[19] = /* permutation of code lengths */
577 {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
578
579 if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL ||
580 (strm->next_in == Z_NULL && strm->avail_in != 0))
581 return Z_STREAM_ERROR;
582
583 state = (struct inflate_state FAR *)strm->state;
584 if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */
585 LOAD();
586 in = have;
587 out = left;
588 ret = Z_OK;
589 for (;;)
590 switch (state->mode) {
591 case HEAD:
592 if (state->wrap == 0) {
593 state->mode = TYPEDO;
594 break;
595 }
596 NEEDBITS(16);
597 #ifdef GUNZIP
598 if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */
599 state->check = crc32(0L, Z_NULL, 0);
600 CRC2(state->check, hold);
601 INITBITS();
602 state->mode = FLAGS;
603 break;
604 }
605 state->flags = 0; /* expect zlib header */
606 if (state->head != Z_NULL)
607 state->head->done = -1;
608 if (!(state->wrap & 1) || /* check if zlib header allowed */
609 #else
610 if (
611 #endif
612 ((BITS(8) << 8) + (hold >> 8)) % 31) {
613 strm->msg = __UNCONST("incorrect header check");
614 state->mode = BAD;
615 break;
616 }
617 if (BITS(4) != Z_DEFLATED) {
618 strm->msg = __UNCONST("unknown compression method");
619 state->mode = BAD;
620 break;
621 }
622 DROPBITS(4);
623 len = BITS(4) + 8;
624 if (len > state->wbits) {
625 strm->msg = __UNCONST("invalid window size");
626 state->mode = BAD;
627 break;
628 }
629 state->dmax = 1U << len;
630 Tracev((stderr, "inflate: zlib header ok\n"));
631 strm->adler = state->check = adler32(0L, Z_NULL, 0);
632 state->mode = hold & 0x200 ? DICTID : TYPE;
633 INITBITS();
634 break;
635 #ifdef GUNZIP
636 case FLAGS:
637 NEEDBITS(16);
638 state->flags = (int)(hold);
639 if ((state->flags & 0xff) != Z_DEFLATED) {
640 strm->msg = __UNCONST("unknown compression method");
641 state->mode = BAD;
642 break;
643 }
644 if (state->flags & 0xe000) {
645 strm->msg = __UNCONST("unknown header flags set");
646 state->mode = BAD;
647 break;
648 }
649 if (state->head != Z_NULL)
650 state->head->text = (int)((hold >> 8) & 1);
651 if (state->flags & 0x0200) CRC2(state->check, hold);
652 INITBITS();
653 state->mode = TIME;
654 case TIME:
655 NEEDBITS(32);
656 if (state->head != Z_NULL)
657 state->head->time = hold;
658 if (state->flags & 0x0200) CRC4(state->check, hold);
659 INITBITS();
660 state->mode = OS;
661 case OS:
662 NEEDBITS(16);
663 if (state->head != Z_NULL) {
664 state->head->xflags = (int)(hold & 0xff);
665 state->head->os = (int)(hold >> 8);
666 }
667 if (state->flags & 0x0200) CRC2(state->check, hold);
668 INITBITS();
669 state->mode = EXLEN;
670 case EXLEN:
671 if (state->flags & 0x0400) {
672 NEEDBITS(16);
673 state->length = (unsigned)(hold);
674 if (state->head != Z_NULL)
675 state->head->extra_len = (unsigned)hold;
676 if (state->flags & 0x0200) CRC2(state->check, hold);
677 INITBITS();
678 }
679 else if (state->head != Z_NULL)
680 state->head->extra = Z_NULL;
681 state->mode = EXTRA;
682 case EXTRA:
683 if (state->flags & 0x0400) {
684 copy = state->length;
685 if (copy > have) copy = have;
686 if (copy) {
687 if (state->head != Z_NULL &&
688 state->head->extra != Z_NULL) {
689 len = state->head->extra_len - state->length;
690 Assert (next != NULL, "next is null");
691 zmemcpy(state->head->extra + len, next,
692 len + copy > state->head->extra_max ?
693 state->head->extra_max - len : copy);
694 }
695 if (state->flags & 0x0200)
696 state->check = crc32(state->check, next, copy);
697 have -= copy;
698 next += copy;
699 state->length -= copy;
700 }
701 if (state->length) goto inf_leave;
702 }
703 state->length = 0;
704 state->mode = NAME;
705 case NAME:
706 if (state->flags & 0x0800) {
707 if (have == 0) goto inf_leave;
708 copy = 0;
709 do {
710 len = (unsigned)(next[copy++]);
711 if (state->head != Z_NULL &&
712 state->head->name != Z_NULL &&
713 state->length < state->head->name_max)
714 state->head->name[state->length++] = len;
715 } while (len && copy < have);
716 if (state->flags & 0x0200)
717 state->check = crc32(state->check, next, copy);
718 have -= copy;
719 next += copy;
720 if (len) goto inf_leave;
721 }
722 else if (state->head != Z_NULL)
723 state->head->name = Z_NULL;
724 state->length = 0;
725 state->mode = COMMENT;
726 case COMMENT:
727 if (state->flags & 0x1000) {
728 if (have == 0) goto inf_leave;
729 copy = 0;
730 do {
731 len = (unsigned)(next[copy++]);
732 if (state->head != Z_NULL &&
733 state->head->comment != Z_NULL &&
734 state->length < state->head->comm_max)
735 state->head->comment[state->length++] = len;
736 } while (len && copy < have);
737 if (state->flags & 0x0200)
738 state->check = crc32(state->check, next, copy);
739 have -= copy;
740 next += copy;
741 if (len) goto inf_leave;
742 }
743 else if (state->head != Z_NULL)
744 state->head->comment = Z_NULL;
745 state->mode = HCRC;
746 case HCRC:
747 if (state->flags & 0x0200) {
748 NEEDBITS(16);
749 if (hold != (state->check & 0xffff)) {
750 strm->msg = __UNCONST("header crc mismatch");
751 state->mode = BAD;
752 break;
753 }
754 INITBITS();
755 }
756 if (state->head != Z_NULL) {
757 state->head->hcrc = (int)((state->flags >> 9) & 1);
758 state->head->done = 1;
759 }
760 strm->adler = state->check = crc32(0L, Z_NULL, 0);
761 state->mode = TYPE;
762 break;
763 #endif
764 case DICTID:
765 NEEDBITS(32);
766 strm->adler = state->check = REVERSE(hold);
767 INITBITS();
768 state->mode = DICT;
769 case DICT:
770 if (state->havedict == 0) {
771 RESTORE();
772 return Z_NEED_DICT;
773 }
774 strm->adler = state->check = adler32(0L, Z_NULL, 0);
775 state->mode = TYPE;
776 case TYPE:
777 if (flush == Z_BLOCK) goto inf_leave;
778 case TYPEDO:
779 if (state->last) {
780 BYTEBITS();
781 state->mode = CHECK;
782 break;
783 }
784 NEEDBITS(3);
785 state->last = BITS(1);
786 DROPBITS(1);
787 switch (BITS(2)) {
788 case 0: /* stored block */
789 Tracev((stderr, "inflate: stored block%s\n",
790 state->last ? " (last)" : ""));
791 state->mode = STORED;
792 break;
793 case 1: /* fixed block */
794 fixedtables(state);
795 Tracev((stderr, "inflate: fixed codes block%s\n",
796 state->last ? " (last)" : ""));
797 state->mode = LEN; /* decode codes */
798 break;
799 case 2: /* dynamic block */
800 Tracev((stderr, "inflate: dynamic codes block%s\n",
801 state->last ? " (last)" : ""));
802 state->mode = TABLE;
803 break;
804 case 3:
805 strm->msg = __UNCONST("invalid block type");
806 state->mode = BAD;
807 }
808 DROPBITS(2);
809 break;
810 case STORED:
811 BYTEBITS(); /* go to byte boundary */
812 NEEDBITS(32);
813 if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
814 strm->msg = __UNCONST("invalid stored block lengths");
815 state->mode = BAD;
816 break;
817 }
818 state->length = (unsigned)hold & 0xffff;
819 Tracev((stderr, "inflate: stored length %u\n",
820 state->length));
821 INITBITS();
822 state->mode = COPY;
823 case COPY:
824 copy = state->length;
825 if (copy) {
826 if (copy > have) copy = have;
827 if (copy > left) copy = left;
828 if (copy == 0) goto inf_leave;
829 zmemcpy(put, next, copy);
830 have -= copy;
831 next += copy;
832 left -= copy;
833 put += copy;
834 state->length -= copy;
835 break;
836 }
837 Tracev((stderr, "inflate: stored end\n"));
838 state->mode = TYPE;
839 break;
840 case TABLE:
841 NEEDBITS(14);
842 state->nlen = BITS(5) + 257;
843 DROPBITS(5);
844 state->ndist = BITS(5) + 1;
845 DROPBITS(5);
846 state->ncode = BITS(4) + 4;
847 DROPBITS(4);
848 #ifndef PKZIP_BUG_WORKAROUND
849 if (state->nlen > 286 || state->ndist > 30) {
850 strm->msg = __UNCONST("too many length or distance symbols");
851 state->mode = BAD;
852 break;
853 }
854 #endif
855 Tracev((stderr, "inflate: table sizes ok\n"));
856 state->have = 0;
857 state->mode = LENLENS;
858 case LENLENS:
859 while (state->have < state->ncode) {
860 NEEDBITS(3);
861 state->lens[order[state->have++]] = (unsigned short)BITS(3);
862 DROPBITS(3);
863 }
864 while (state->have < 19)
865 state->lens[order[state->have++]] = 0;
866 state->next = state->codes;
867 state->lencode = (code const FAR *)(state->next);
868 state->lenbits = 7;
869 ret = inflate_table(CODES, state->lens, 19, &(state->next),
870 &(state->lenbits), state->work);
871 if (ret) {
872 strm->msg = __UNCONST("invalid code lengths set");
873 state->mode = BAD;
874 break;
875 }
876 Tracev((stderr, "inflate: code lengths ok\n"));
877 state->have = 0;
878 state->mode = CODELENS;
879 case CODELENS:
880 while (state->have < state->nlen + state->ndist) {
881 for (;;) {
882 this = state->lencode[BITS(state->lenbits)];
883 if ((unsigned)(this.bits) <= bits) break;
884 PULLBYTE();
885 }
886 if (this.val < 16) {
887 NEEDBITS(this.bits);
888 DROPBITS(this.bits);
889 state->lens[state->have++] = this.val;
890 }
891 else {
892 if (this.val == 16) {
893 NEEDBITS(this.bits + 2);
894 DROPBITS(this.bits);
895 if (state->have == 0) {
896 strm->msg = __UNCONST("invalid bit length repeat");
897 state->mode = BAD;
898 break;
899 }
900 len = state->lens[state->have - 1];
901 copy = 3 + BITS(2);
902 DROPBITS(2);
903 }
904 else if (this.val == 17) {
905 NEEDBITS(this.bits + 3);
906 DROPBITS(this.bits);
907 len = 0;
908 copy = 3 + BITS(3);
909 DROPBITS(3);
910 }
911 else {
912 NEEDBITS(this.bits + 7);
913 DROPBITS(this.bits);
914 len = 0;
915 copy = 11 + BITS(7);
916 DROPBITS(7);
917 }
918 if (state->have + copy > state->nlen + state->ndist) {
919 strm->msg = __UNCONST("invalid bit length repeat");
920 state->mode = BAD;
921 break;
922 }
923 while (copy--)
924 state->lens[state->have++] = (unsigned short)len;
925 }
926 }
927
928 /* handle error breaks in while */
929 if (state->mode == BAD) break;
930
931 /* build code tables */
932 state->next = state->codes;
933 state->lencode = (code const FAR *)(state->next);
934 state->lenbits = 9;
935 ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
936 &(state->lenbits), state->work);
937 if (ret) {
938 strm->msg = __UNCONST("invalid literal/lengths set");
939 state->mode = BAD;
940 break;
941 }
942 state->distcode = (code const FAR *)(state->next);
943 state->distbits = 6;
944 ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
945 &(state->next), &(state->distbits), state->work);
946 if (ret) {
947 strm->msg = __UNCONST("invalid distances set");
948 state->mode = BAD;
949 break;
950 }
951 Tracev((stderr, "inflate: codes ok\n"));
952 state->mode = LEN;
953 case LEN:
954 if (have >= 6 && left >= 258) {
955 RESTORE();
956 inflate_fast(strm, out);
957 LOAD();
958 break;
959 }
960 for (;;) {
961 this = state->lencode[BITS(state->lenbits)];
962 if ((unsigned)(this.bits) <= bits) break;
963 PULLBYTE();
964 }
965 if (this.op && (this.op & 0xf0) == 0) {
966 last = this;
967 for (;;) {
968 this = state->lencode[last.val +
969 (BITS(last.bits + last.op) >> last.bits)];
970 if ((unsigned)(last.bits + this.bits) <= bits) break;
971 PULLBYTE();
972 }
973 DROPBITS(last.bits);
974 }
975 DROPBITS(this.bits);
976 state->length = (unsigned)this.val;
977 if ((int)(this.op) == 0) {
978 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
979 "inflate: literal '%c'\n" :
980 "inflate: literal 0x%02x\n", this.val));
981 state->mode = LIT;
982 break;
983 }
984 if (this.op & 32) {
985 Tracevv((stderr, "inflate: end of block\n"));
986 state->mode = TYPE;
987 break;
988 }
989 if (this.op & 64) {
990 strm->msg = __UNCONST("invalid literal/length code");
991 state->mode = BAD;
992 break;
993 }
994 state->extra = (unsigned)(this.op) & 15;
995 state->mode = LENEXT;
996 case LENEXT:
997 if (state->extra) {
998 NEEDBITS(state->extra);
999 state->length += BITS(state->extra);
1000 DROPBITS(state->extra);
1001 }
1002 Tracevv((stderr, "inflate: length %u\n", state->length));
1003 state->mode = DIST;
1004 case DIST:
1005 for (;;) {
1006 this = state->distcode[BITS(state->distbits)];
1007 if ((unsigned)(this.bits) <= bits) break;
1008 PULLBYTE();
1009 }
1010 if ((this.op & 0xf0) == 0) {
1011 last = this;
1012 for (;;) {
1013 this = state->distcode[last.val +
1014 (BITS(last.bits + last.op) >> last.bits)];
1015 if ((unsigned)(last.bits + this.bits) <= bits) break;
1016 PULLBYTE();
1017 }
1018 DROPBITS(last.bits);
1019 }
1020 DROPBITS(this.bits);
1021 if (this.op & 64) {
1022 strm->msg = __UNCONST("invalid distance code");
1023 state->mode = BAD;
1024 break;
1025 }
1026 state->offset = (unsigned)this.val;
1027 state->extra = (unsigned)(this.op) & 15;
1028 state->mode = DISTEXT;
1029 case DISTEXT:
1030 if (state->extra) {
1031 NEEDBITS(state->extra);
1032 state->offset += BITS(state->extra);
1033 DROPBITS(state->extra);
1034 }
1035 #ifdef INFLATE_STRICT
1036 if (state->offset > state->dmax) {
1037 strm->msg = __UNCONST("invalid distance too far back");
1038 state->mode = BAD;
1039 break;
1040 }
1041 #endif
1042 if (state->offset > state->whave + out - left) {
1043 strm->msg = __UNCONST("invalid distance too far back");
1044 state->mode = BAD;
1045 break;
1046 }
1047 Tracevv((stderr, "inflate: distance %u\n", state->offset));
1048 state->mode = MATCH;
1049 case MATCH:
1050 if (left == 0) goto inf_leave;
1051 copy = out - left;
1052 if (state->offset > copy) { /* copy from window */
1053 copy = state->offset - copy;
1054 if (copy > state->write) {
1055 copy -= state->write;
1056 from = state->window + (state->wsize - copy);
1057 }
1058 else
1059 from = state->window + (state->write - copy);
1060 if (copy > state->length) copy = state->length;
1061 }
1062 else { /* copy from output */
1063 from = put - state->offset;
1064 copy = state->length;
1065 }
1066 if (copy > left) copy = left;
1067 left -= copy;
1068 state->length -= copy;
1069 do {
1070 *put++ = *from++;
1071 } while (--copy);
1072 if (state->length == 0) state->mode = LEN;
1073 break;
1074 case LIT:
1075 if (left == 0) goto inf_leave;
1076 *put++ = (unsigned char)(state->length);
1077 left--;
1078 state->mode = LEN;
1079 break;
1080 case CHECK:
1081 if (state->wrap) {
1082 NEEDBITS(32);
1083 out -= left;
1084 strm->total_out += out;
1085 state->total += out;
1086 if (out)
1087 strm->adler = state->check =
1088 UPDATE(state->check, put - out, out);
1089 out = left;
1090 if ((
1091 #ifdef GUNZIP
1092 state->flags ? hold :
1093 #endif
1094 REVERSE(hold)) != state->check) {
1095 strm->msg = __UNCONST("incorrect data check");
1096 state->mode = BAD;
1097 break;
1098 }
1099 INITBITS();
1100 Tracev((stderr, "inflate: check matches trailer\n"));
1101 }
1102 #ifdef GUNZIP
1103 state->mode = LENGTH;
1104 case LENGTH:
1105 if (state->wrap && state->flags) {
1106 NEEDBITS(32);
1107 if (hold != (state->total & 0xffffffffUL)) {
1108 strm->msg = __UNCONST("incorrect length check");
1109 state->mode = BAD;
1110 break;
1111 }
1112 INITBITS();
1113 Tracev((stderr, "inflate: length matches trailer\n"));
1114 }
1115 #endif
1116 state->mode = DONE;
1117 case DONE:
1118 ret = Z_STREAM_END;
1119 goto inf_leave;
1120 case BAD:
1121 ret = Z_DATA_ERROR;
1122 goto inf_leave;
1123 case MEM:
1124 return Z_MEM_ERROR;
1125 case SYNC:
1126 default:
1127 return Z_STREAM_ERROR;
1128 }
1129
1130 /*
1131 Return from inflate(), updating the total counts and the check value.
1132 If there was no progress during the inflate() call, return a buffer
1133 error. Call updatewindow() to create and/or update the window state.
1134 Note: a memory error from inflate() is non-recoverable.
1135 */
1136 inf_leave:
1137 RESTORE();
1138 if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
1139 if (updatewindow(strm, out)) {
1140 state->mode = MEM;
1141 return Z_MEM_ERROR;
1142 }
1143 in -= strm->avail_in;
1144 out -= strm->avail_out;
1145 strm->total_in += in;
1146 strm->total_out += out;
1147 state->total += out;
1148 if (state->wrap && out)
1149 strm->adler = state->check =
1150 UPDATE(state->check, strm->next_out - out, out);
1151 strm->data_type = state->bits + (state->last ? 64 : 0) +
1152 (state->mode == TYPE ? 128 : 0);
1153 if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
1154 ret = Z_BUF_ERROR;
1155 return ret;
1156 }
1157
1158 int ZEXPORT inflateEnd(strm)
1159 z_streamp strm;
1160 {
1161 struct inflate_state FAR *state;
1162 if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
1163 return Z_STREAM_ERROR;
1164 state = (struct inflate_state FAR *)strm->state;
1165 if (state->window != Z_NULL) ZFREE(strm, state->window);
1166 ZFREE(strm, strm->state);
1167 strm->state = Z_NULL;
1168 Tracev((stderr, "inflate: end\n"));
1169 return Z_OK;
1170 }
1171
1172 int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
1173 z_streamp strm;
1174 const Bytef *dictionary;
1175 uInt dictLength;
1176 {
1177 struct inflate_state FAR *state;
1178 unsigned long id;
1179
1180 /* check state */
1181 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1182 state = (struct inflate_state FAR *)strm->state;
1183 if (state->wrap != 0 && state->mode != DICT)
1184 return Z_STREAM_ERROR;
1185
1186 /* check for correct dictionary id */
1187 if (state->mode == DICT) {
1188 id = adler32(0L, Z_NULL, 0);
1189 id = adler32(id, dictionary, dictLength);
1190 if (id != state->check)
1191 return Z_DATA_ERROR;
1192 }
1193
1194 /* copy dictionary to window */
1195 if (updatewindow(strm, strm->avail_out)) {
1196 state->mode = MEM;
1197 return Z_MEM_ERROR;
1198 }
1199 if (dictLength > state->wsize) {
1200 zmemcpy(state->window, dictionary + dictLength - state->wsize,
1201 state->wsize);
1202 state->whave = state->wsize;
1203 }
1204 else {
1205 zmemcpy(state->window + state->wsize - dictLength, dictionary,
1206 dictLength);
1207 state->whave = dictLength;
1208 }
1209 state->havedict = 1;
1210 Tracev((stderr, "inflate: dictionary set\n"));
1211 return Z_OK;
1212 }
1213
1214 int ZEXPORT inflateGetHeader(strm, head)
1215 z_streamp strm;
1216 gz_headerp head;
1217 {
1218 struct inflate_state FAR *state;
1219
1220 /* check state */
1221 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1222 state = (struct inflate_state FAR *)strm->state;
1223 if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
1224
1225 /* save header structure */
1226 state->head = head;
1227 head->done = 0;
1228 return Z_OK;
1229 }
1230
1231 /*
1232 Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found
1233 or when out of input. When called, *have is the number of pattern bytes
1234 found in order so far, in 0..3. On return *have is updated to the new
1235 state. If on return *have equals four, then the pattern was found and the
1236 return value is how many bytes were read including the last byte of the
1237 pattern. If *have is less than four, then the pattern has not been found
1238 yet and the return value is len. In the latter case, syncsearch() can be
1239 called again with more data and the *have state. *have is initialized to
1240 zero for the first call.
1241 */
1242 local unsigned syncsearch(have, buf, len)
1243 unsigned FAR *have;
1244 unsigned char FAR *buf;
1245 unsigned len;
1246 {
1247 unsigned got;
1248 unsigned next;
1249
1250 got = *have;
1251 next = 0;
1252 while (next < len && got < 4) {
1253 if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
1254 got++;
1255 else if (buf[next])
1256 got = 0;
1257 else
1258 got = 4 - got;
1259 next++;
1260 }
1261 *have = got;
1262 return next;
1263 }
1264
1265 int ZEXPORT inflateSync(strm)
1266 z_streamp strm;
1267 {
1268 unsigned len; /* number of bytes to look at or looked at */
1269 unsigned long in, out; /* temporary to save total_in and total_out */
1270 unsigned char buf[4]; /* to restore bit buffer to byte string */
1271 struct inflate_state FAR *state;
1272
1273 /* check parameters */
1274 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1275 state = (struct inflate_state FAR *)strm->state;
1276 if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
1277
1278 /* if first time, start search in bit buffer */
1279 if (state->mode != SYNC) {
1280 state->mode = SYNC;
1281 state->hold <<= state->bits & 7;
1282 state->bits -= state->bits & 7;
1283 len = 0;
1284 while (state->bits >= 8) {
1285 buf[len++] = (unsigned char)(state->hold);
1286 state->hold >>= 8;
1287 state->bits -= 8;
1288 }
1289 state->have = 0;
1290 syncsearch(&(state->have), buf, len);
1291 }
1292
1293 /* search available input */
1294 len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
1295 strm->avail_in -= len;
1296 strm->next_in += len;
1297 strm->total_in += len;
1298
1299 /* return no joy or set up to restart inflate() on a new block */
1300 if (state->have != 4) return Z_DATA_ERROR;
1301 in = strm->total_in; out = strm->total_out;
1302 inflateReset(strm);
1303 strm->total_in = in; strm->total_out = out;
1304 state->mode = TYPE;
1305 return Z_OK;
1306 }
1307
1308 /*
1309 Returns true if inflate is currently at the end of a block generated by
1310 Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
1311 implementation to provide an additional safety check. PPP uses
1312 Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
1313 block. When decompressing, PPP checks that at the end of input packet,
1314 inflate is waiting for these length bytes.
1315 */
1316 int ZEXPORT inflateSyncPoint(strm)
1317 z_streamp strm;
1318 {
1319 struct inflate_state FAR *state;
1320
1321 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1322 state = (struct inflate_state FAR *)strm->state;
1323 return state->mode == STORED && state->bits == 0;
1324 }
1325
1326 int ZEXPORT inflateCopy(dest, source)
1327 z_streamp dest;
1328 z_streamp source;
1329 {
1330 struct inflate_state FAR *state;
1331 struct inflate_state FAR *copy;
1332 unsigned char FAR *window;
1333 unsigned wsize;
1334
1335 /* check input */
1336 if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||
1337 source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)
1338 return Z_STREAM_ERROR;
1339 state = (struct inflate_state FAR *)source->state;
1340
1341 /* allocate space */
1342 copy = (struct inflate_state FAR *)
1343 ZALLOC(source, 1, sizeof(struct inflate_state));
1344 if (copy == Z_NULL) return Z_MEM_ERROR;
1345 window = Z_NULL;
1346 if (state->window != Z_NULL) {
1347 window = (unsigned char FAR *)
1348 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
1349 if (window == Z_NULL) {
1350 ZFREE(source, copy);
1351 return Z_MEM_ERROR;
1352 }
1353 }
1354
1355 /* copy state */
1356 zmemcpy(dest, source, sizeof(z_stream));
1357 zmemcpy(copy, state, sizeof(struct inflate_state));
1358 if (state->lencode >= state->codes &&
1359 state->lencode <= state->codes + ENOUGH - 1) {
1360 copy->lencode = copy->codes + (state->lencode - state->codes);
1361 copy->distcode = copy->codes + (state->distcode - state->codes);
1362 }
1363 copy->next = copy->codes + (state->next - state->codes);
1364 if (window != Z_NULL) {
1365 wsize = 1U << state->wbits;
1366 zmemcpy(window, state->window, wsize);
1367 }
1368 copy->window = window;
1369 dest->state = (struct internal_state FAR *)copy;
1370 return Z_OK;
1371 }
1372