inflate.c revision 1.2 1 /* $NetBSD: inflate.c,v 1.2 2006/01/27 00:45:27 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 zmemcpy(state->head->extra + len, next,
691 len + copy > state->head->extra_max ?
692 state->head->extra_max - len : copy);
693 }
694 if (state->flags & 0x0200)
695 state->check = crc32(state->check, next, copy);
696 have -= copy;
697 next += copy;
698 state->length -= copy;
699 }
700 if (state->length) goto inf_leave;
701 }
702 state->length = 0;
703 state->mode = NAME;
704 case NAME:
705 if (state->flags & 0x0800) {
706 if (have == 0) goto inf_leave;
707 copy = 0;
708 do {
709 len = (unsigned)(next[copy++]);
710 if (state->head != Z_NULL &&
711 state->head->name != Z_NULL &&
712 state->length < state->head->name_max)
713 state->head->name[state->length++] = len;
714 } while (len && copy < have);
715 if (state->flags & 0x0200)
716 state->check = crc32(state->check, next, copy);
717 have -= copy;
718 next += copy;
719 if (len) goto inf_leave;
720 }
721 else if (state->head != Z_NULL)
722 state->head->name = Z_NULL;
723 state->length = 0;
724 state->mode = COMMENT;
725 case COMMENT:
726 if (state->flags & 0x1000) {
727 if (have == 0) goto inf_leave;
728 copy = 0;
729 do {
730 len = (unsigned)(next[copy++]);
731 if (state->head != Z_NULL &&
732 state->head->comment != Z_NULL &&
733 state->length < state->head->comm_max)
734 state->head->comment[state->length++] = len;
735 } while (len && copy < have);
736 if (state->flags & 0x0200)
737 state->check = crc32(state->check, next, copy);
738 have -= copy;
739 next += copy;
740 if (len) goto inf_leave;
741 }
742 else if (state->head != Z_NULL)
743 state->head->comment = Z_NULL;
744 state->mode = HCRC;
745 case HCRC:
746 if (state->flags & 0x0200) {
747 NEEDBITS(16);
748 if (hold != (state->check & 0xffff)) {
749 strm->msg = __UNCONST("header crc mismatch");
750 state->mode = BAD;
751 break;
752 }
753 INITBITS();
754 }
755 if (state->head != Z_NULL) {
756 state->head->hcrc = (int)((state->flags >> 9) & 1);
757 state->head->done = 1;
758 }
759 strm->adler = state->check = crc32(0L, Z_NULL, 0);
760 state->mode = TYPE;
761 break;
762 #endif
763 case DICTID:
764 NEEDBITS(32);
765 strm->adler = state->check = REVERSE(hold);
766 INITBITS();
767 state->mode = DICT;
768 case DICT:
769 if (state->havedict == 0) {
770 RESTORE();
771 return Z_NEED_DICT;
772 }
773 strm->adler = state->check = adler32(0L, Z_NULL, 0);
774 state->mode = TYPE;
775 case TYPE:
776 if (flush == Z_BLOCK) goto inf_leave;
777 case TYPEDO:
778 if (state->last) {
779 BYTEBITS();
780 state->mode = CHECK;
781 break;
782 }
783 NEEDBITS(3);
784 state->last = BITS(1);
785 DROPBITS(1);
786 switch (BITS(2)) {
787 case 0: /* stored block */
788 Tracev((stderr, "inflate: stored block%s\n",
789 state->last ? " (last)" : ""));
790 state->mode = STORED;
791 break;
792 case 1: /* fixed block */
793 fixedtables(state);
794 Tracev((stderr, "inflate: fixed codes block%s\n",
795 state->last ? " (last)" : ""));
796 state->mode = LEN; /* decode codes */
797 break;
798 case 2: /* dynamic block */
799 Tracev((stderr, "inflate: dynamic codes block%s\n",
800 state->last ? " (last)" : ""));
801 state->mode = TABLE;
802 break;
803 case 3:
804 strm->msg = __UNCONST("invalid block type");
805 state->mode = BAD;
806 }
807 DROPBITS(2);
808 break;
809 case STORED:
810 BYTEBITS(); /* go to byte boundary */
811 NEEDBITS(32);
812 if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
813 strm->msg = __UNCONST("invalid stored block lengths");
814 state->mode = BAD;
815 break;
816 }
817 state->length = (unsigned)hold & 0xffff;
818 Tracev((stderr, "inflate: stored length %u\n",
819 state->length));
820 INITBITS();
821 state->mode = COPY;
822 case COPY:
823 copy = state->length;
824 if (copy) {
825 if (copy > have) copy = have;
826 if (copy > left) copy = left;
827 if (copy == 0) goto inf_leave;
828 zmemcpy(put, next, copy);
829 have -= copy;
830 next += copy;
831 left -= copy;
832 put += copy;
833 state->length -= copy;
834 break;
835 }
836 Tracev((stderr, "inflate: stored end\n"));
837 state->mode = TYPE;
838 break;
839 case TABLE:
840 NEEDBITS(14);
841 state->nlen = BITS(5) + 257;
842 DROPBITS(5);
843 state->ndist = BITS(5) + 1;
844 DROPBITS(5);
845 state->ncode = BITS(4) + 4;
846 DROPBITS(4);
847 #ifndef PKZIP_BUG_WORKAROUND
848 if (state->nlen > 286 || state->ndist > 30) {
849 strm->msg = __UNCONST("too many length or distance symbols");
850 state->mode = BAD;
851 break;
852 }
853 #endif
854 Tracev((stderr, "inflate: table sizes ok\n"));
855 state->have = 0;
856 state->mode = LENLENS;
857 case LENLENS:
858 while (state->have < state->ncode) {
859 NEEDBITS(3);
860 state->lens[order[state->have++]] = (unsigned short)BITS(3);
861 DROPBITS(3);
862 }
863 while (state->have < 19)
864 state->lens[order[state->have++]] = 0;
865 state->next = state->codes;
866 state->lencode = (code const FAR *)(state->next);
867 state->lenbits = 7;
868 ret = inflate_table(CODES, state->lens, 19, &(state->next),
869 &(state->lenbits), state->work);
870 if (ret) {
871 strm->msg = __UNCONST("invalid code lengths set");
872 state->mode = BAD;
873 break;
874 }
875 Tracev((stderr, "inflate: code lengths ok\n"));
876 state->have = 0;
877 state->mode = CODELENS;
878 case CODELENS:
879 while (state->have < state->nlen + state->ndist) {
880 for (;;) {
881 this = state->lencode[BITS(state->lenbits)];
882 if ((unsigned)(this.bits) <= bits) break;
883 PULLBYTE();
884 }
885 if (this.val < 16) {
886 NEEDBITS(this.bits);
887 DROPBITS(this.bits);
888 state->lens[state->have++] = this.val;
889 }
890 else {
891 if (this.val == 16) {
892 NEEDBITS(this.bits + 2);
893 DROPBITS(this.bits);
894 if (state->have == 0) {
895 strm->msg = __UNCONST("invalid bit length repeat");
896 state->mode = BAD;
897 break;
898 }
899 len = state->lens[state->have - 1];
900 copy = 3 + BITS(2);
901 DROPBITS(2);
902 }
903 else if (this.val == 17) {
904 NEEDBITS(this.bits + 3);
905 DROPBITS(this.bits);
906 len = 0;
907 copy = 3 + BITS(3);
908 DROPBITS(3);
909 }
910 else {
911 NEEDBITS(this.bits + 7);
912 DROPBITS(this.bits);
913 len = 0;
914 copy = 11 + BITS(7);
915 DROPBITS(7);
916 }
917 if (state->have + copy > state->nlen + state->ndist) {
918 strm->msg = __UNCONST("invalid bit length repeat");
919 state->mode = BAD;
920 break;
921 }
922 while (copy--)
923 state->lens[state->have++] = (unsigned short)len;
924 }
925 }
926
927 /* handle error breaks in while */
928 if (state->mode == BAD) break;
929
930 /* build code tables */
931 state->next = state->codes;
932 state->lencode = (code const FAR *)(state->next);
933 state->lenbits = 9;
934 ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
935 &(state->lenbits), state->work);
936 if (ret) {
937 strm->msg = __UNCONST("invalid literal/lengths set");
938 state->mode = BAD;
939 break;
940 }
941 state->distcode = (code const FAR *)(state->next);
942 state->distbits = 6;
943 ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
944 &(state->next), &(state->distbits), state->work);
945 if (ret) {
946 strm->msg = __UNCONST("invalid distances set");
947 state->mode = BAD;
948 break;
949 }
950 Tracev((stderr, "inflate: codes ok\n"));
951 state->mode = LEN;
952 case LEN:
953 if (have >= 6 && left >= 258) {
954 RESTORE();
955 inflate_fast(strm, out);
956 LOAD();
957 break;
958 }
959 for (;;) {
960 this = state->lencode[BITS(state->lenbits)];
961 if ((unsigned)(this.bits) <= bits) break;
962 PULLBYTE();
963 }
964 if (this.op && (this.op & 0xf0) == 0) {
965 last = this;
966 for (;;) {
967 this = state->lencode[last.val +
968 (BITS(last.bits + last.op) >> last.bits)];
969 if ((unsigned)(last.bits + this.bits) <= bits) break;
970 PULLBYTE();
971 }
972 DROPBITS(last.bits);
973 }
974 DROPBITS(this.bits);
975 state->length = (unsigned)this.val;
976 if ((int)(this.op) == 0) {
977 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
978 "inflate: literal '%c'\n" :
979 "inflate: literal 0x%02x\n", this.val));
980 state->mode = LIT;
981 break;
982 }
983 if (this.op & 32) {
984 Tracevv((stderr, "inflate: end of block\n"));
985 state->mode = TYPE;
986 break;
987 }
988 if (this.op & 64) {
989 strm->msg = __UNCONST("invalid literal/length code");
990 state->mode = BAD;
991 break;
992 }
993 state->extra = (unsigned)(this.op) & 15;
994 state->mode = LENEXT;
995 case LENEXT:
996 if (state->extra) {
997 NEEDBITS(state->extra);
998 state->length += BITS(state->extra);
999 DROPBITS(state->extra);
1000 }
1001 Tracevv((stderr, "inflate: length %u\n", state->length));
1002 state->mode = DIST;
1003 case DIST:
1004 for (;;) {
1005 this = state->distcode[BITS(state->distbits)];
1006 if ((unsigned)(this.bits) <= bits) break;
1007 PULLBYTE();
1008 }
1009 if ((this.op & 0xf0) == 0) {
1010 last = this;
1011 for (;;) {
1012 this = state->distcode[last.val +
1013 (BITS(last.bits + last.op) >> last.bits)];
1014 if ((unsigned)(last.bits + this.bits) <= bits) break;
1015 PULLBYTE();
1016 }
1017 DROPBITS(last.bits);
1018 }
1019 DROPBITS(this.bits);
1020 if (this.op & 64) {
1021 strm->msg = __UNCONST("invalid distance code");
1022 state->mode = BAD;
1023 break;
1024 }
1025 state->offset = (unsigned)this.val;
1026 state->extra = (unsigned)(this.op) & 15;
1027 state->mode = DISTEXT;
1028 case DISTEXT:
1029 if (state->extra) {
1030 NEEDBITS(state->extra);
1031 state->offset += BITS(state->extra);
1032 DROPBITS(state->extra);
1033 }
1034 #ifdef INFLATE_STRICT
1035 if (state->offset > state->dmax) {
1036 strm->msg = __UNCONST("invalid distance too far back");
1037 state->mode = BAD;
1038 break;
1039 }
1040 #endif
1041 if (state->offset > state->whave + out - left) {
1042 strm->msg = __UNCONST("invalid distance too far back");
1043 state->mode = BAD;
1044 break;
1045 }
1046 Tracevv((stderr, "inflate: distance %u\n", state->offset));
1047 state->mode = MATCH;
1048 case MATCH:
1049 if (left == 0) goto inf_leave;
1050 copy = out - left;
1051 if (state->offset > copy) { /* copy from window */
1052 copy = state->offset - copy;
1053 if (copy > state->write) {
1054 copy -= state->write;
1055 from = state->window + (state->wsize - copy);
1056 }
1057 else
1058 from = state->window + (state->write - copy);
1059 if (copy > state->length) copy = state->length;
1060 }
1061 else { /* copy from output */
1062 from = put - state->offset;
1063 copy = state->length;
1064 }
1065 if (copy > left) copy = left;
1066 left -= copy;
1067 state->length -= copy;
1068 do {
1069 *put++ = *from++;
1070 } while (--copy);
1071 if (state->length == 0) state->mode = LEN;
1072 break;
1073 case LIT:
1074 if (left == 0) goto inf_leave;
1075 *put++ = (unsigned char)(state->length);
1076 left--;
1077 state->mode = LEN;
1078 break;
1079 case CHECK:
1080 if (state->wrap) {
1081 NEEDBITS(32);
1082 out -= left;
1083 strm->total_out += out;
1084 state->total += out;
1085 if (out)
1086 strm->adler = state->check =
1087 UPDATE(state->check, put - out, out);
1088 out = left;
1089 if ((
1090 #ifdef GUNZIP
1091 state->flags ? hold :
1092 #endif
1093 REVERSE(hold)) != state->check) {
1094 strm->msg = __UNCONST("incorrect data check");
1095 state->mode = BAD;
1096 break;
1097 }
1098 INITBITS();
1099 Tracev((stderr, "inflate: check matches trailer\n"));
1100 }
1101 #ifdef GUNZIP
1102 state->mode = LENGTH;
1103 case LENGTH:
1104 if (state->wrap && state->flags) {
1105 NEEDBITS(32);
1106 if (hold != (state->total & 0xffffffffUL)) {
1107 strm->msg = __UNCONST("incorrect length check");
1108 state->mode = BAD;
1109 break;
1110 }
1111 INITBITS();
1112 Tracev((stderr, "inflate: length matches trailer\n"));
1113 }
1114 #endif
1115 state->mode = DONE;
1116 case DONE:
1117 ret = Z_STREAM_END;
1118 goto inf_leave;
1119 case BAD:
1120 ret = Z_DATA_ERROR;
1121 goto inf_leave;
1122 case MEM:
1123 return Z_MEM_ERROR;
1124 case SYNC:
1125 default:
1126 return Z_STREAM_ERROR;
1127 }
1128
1129 /*
1130 Return from inflate(), updating the total counts and the check value.
1131 If there was no progress during the inflate() call, return a buffer
1132 error. Call updatewindow() to create and/or update the window state.
1133 Note: a memory error from inflate() is non-recoverable.
1134 */
1135 inf_leave:
1136 RESTORE();
1137 if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
1138 if (updatewindow(strm, out)) {
1139 state->mode = MEM;
1140 return Z_MEM_ERROR;
1141 }
1142 in -= strm->avail_in;
1143 out -= strm->avail_out;
1144 strm->total_in += in;
1145 strm->total_out += out;
1146 state->total += out;
1147 if (state->wrap && out)
1148 strm->adler = state->check =
1149 UPDATE(state->check, strm->next_out - out, out);
1150 strm->data_type = state->bits + (state->last ? 64 : 0) +
1151 (state->mode == TYPE ? 128 : 0);
1152 if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
1153 ret = Z_BUF_ERROR;
1154 return ret;
1155 }
1156
1157 int ZEXPORT inflateEnd(strm)
1158 z_streamp strm;
1159 {
1160 struct inflate_state FAR *state;
1161 if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
1162 return Z_STREAM_ERROR;
1163 state = (struct inflate_state FAR *)strm->state;
1164 if (state->window != Z_NULL) ZFREE(strm, state->window);
1165 ZFREE(strm, strm->state);
1166 strm->state = Z_NULL;
1167 Tracev((stderr, "inflate: end\n"));
1168 return Z_OK;
1169 }
1170
1171 int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
1172 z_streamp strm;
1173 const Bytef *dictionary;
1174 uInt dictLength;
1175 {
1176 struct inflate_state FAR *state;
1177 unsigned long id;
1178
1179 /* check state */
1180 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1181 state = (struct inflate_state FAR *)strm->state;
1182 if (state->wrap != 0 && state->mode != DICT)
1183 return Z_STREAM_ERROR;
1184
1185 /* check for correct dictionary id */
1186 if (state->mode == DICT) {
1187 id = adler32(0L, Z_NULL, 0);
1188 id = adler32(id, dictionary, dictLength);
1189 if (id != state->check)
1190 return Z_DATA_ERROR;
1191 }
1192
1193 /* copy dictionary to window */
1194 if (updatewindow(strm, strm->avail_out)) {
1195 state->mode = MEM;
1196 return Z_MEM_ERROR;
1197 }
1198 if (dictLength > state->wsize) {
1199 zmemcpy(state->window, dictionary + dictLength - state->wsize,
1200 state->wsize);
1201 state->whave = state->wsize;
1202 }
1203 else {
1204 zmemcpy(state->window + state->wsize - dictLength, dictionary,
1205 dictLength);
1206 state->whave = dictLength;
1207 }
1208 state->havedict = 1;
1209 Tracev((stderr, "inflate: dictionary set\n"));
1210 return Z_OK;
1211 }
1212
1213 int ZEXPORT inflateGetHeader(strm, head)
1214 z_streamp strm;
1215 gz_headerp head;
1216 {
1217 struct inflate_state FAR *state;
1218
1219 /* check state */
1220 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1221 state = (struct inflate_state FAR *)strm->state;
1222 if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
1223
1224 /* save header structure */
1225 state->head = head;
1226 head->done = 0;
1227 return Z_OK;
1228 }
1229
1230 /*
1231 Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found
1232 or when out of input. When called, *have is the number of pattern bytes
1233 found in order so far, in 0..3. On return *have is updated to the new
1234 state. If on return *have equals four, then the pattern was found and the
1235 return value is how many bytes were read including the last byte of the
1236 pattern. If *have is less than four, then the pattern has not been found
1237 yet and the return value is len. In the latter case, syncsearch() can be
1238 called again with more data and the *have state. *have is initialized to
1239 zero for the first call.
1240 */
1241 local unsigned syncsearch(have, buf, len)
1242 unsigned FAR *have;
1243 unsigned char FAR *buf;
1244 unsigned len;
1245 {
1246 unsigned got;
1247 unsigned next;
1248
1249 got = *have;
1250 next = 0;
1251 while (next < len && got < 4) {
1252 if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
1253 got++;
1254 else if (buf[next])
1255 got = 0;
1256 else
1257 got = 4 - got;
1258 next++;
1259 }
1260 *have = got;
1261 return next;
1262 }
1263
1264 int ZEXPORT inflateSync(strm)
1265 z_streamp strm;
1266 {
1267 unsigned len; /* number of bytes to look at or looked at */
1268 unsigned long in, out; /* temporary to save total_in and total_out */
1269 unsigned char buf[4]; /* to restore bit buffer to byte string */
1270 struct inflate_state FAR *state;
1271
1272 /* check parameters */
1273 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1274 state = (struct inflate_state FAR *)strm->state;
1275 if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
1276
1277 /* if first time, start search in bit buffer */
1278 if (state->mode != SYNC) {
1279 state->mode = SYNC;
1280 state->hold <<= state->bits & 7;
1281 state->bits -= state->bits & 7;
1282 len = 0;
1283 while (state->bits >= 8) {
1284 buf[len++] = (unsigned char)(state->hold);
1285 state->hold >>= 8;
1286 state->bits -= 8;
1287 }
1288 state->have = 0;
1289 syncsearch(&(state->have), buf, len);
1290 }
1291
1292 /* search available input */
1293 len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
1294 strm->avail_in -= len;
1295 strm->next_in += len;
1296 strm->total_in += len;
1297
1298 /* return no joy or set up to restart inflate() on a new block */
1299 if (state->have != 4) return Z_DATA_ERROR;
1300 in = strm->total_in; out = strm->total_out;
1301 inflateReset(strm);
1302 strm->total_in = in; strm->total_out = out;
1303 state->mode = TYPE;
1304 return Z_OK;
1305 }
1306
1307 /*
1308 Returns true if inflate is currently at the end of a block generated by
1309 Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
1310 implementation to provide an additional safety check. PPP uses
1311 Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
1312 block. When decompressing, PPP checks that at the end of input packet,
1313 inflate is waiting for these length bytes.
1314 */
1315 int ZEXPORT inflateSyncPoint(strm)
1316 z_streamp strm;
1317 {
1318 struct inflate_state FAR *state;
1319
1320 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1321 state = (struct inflate_state FAR *)strm->state;
1322 return state->mode == STORED && state->bits == 0;
1323 }
1324
1325 int ZEXPORT inflateCopy(dest, source)
1326 z_streamp dest;
1327 z_streamp source;
1328 {
1329 struct inflate_state FAR *state;
1330 struct inflate_state FAR *copy;
1331 unsigned char FAR *window;
1332 unsigned wsize;
1333
1334 /* check input */
1335 if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||
1336 source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)
1337 return Z_STREAM_ERROR;
1338 state = (struct inflate_state FAR *)source->state;
1339
1340 /* allocate space */
1341 copy = (struct inflate_state FAR *)
1342 ZALLOC(source, 1, sizeof(struct inflate_state));
1343 if (copy == Z_NULL) return Z_MEM_ERROR;
1344 window = Z_NULL;
1345 if (state->window != Z_NULL) {
1346 window = (unsigned char FAR *)
1347 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
1348 if (window == Z_NULL) {
1349 ZFREE(source, copy);
1350 return Z_MEM_ERROR;
1351 }
1352 }
1353
1354 /* copy state */
1355 zmemcpy(dest, source, sizeof(z_stream));
1356 zmemcpy(copy, state, sizeof(struct inflate_state));
1357 if (state->lencode >= state->codes &&
1358 state->lencode <= state->codes + ENOUGH - 1) {
1359 copy->lencode = copy->codes + (state->lencode - state->codes);
1360 copy->distcode = copy->codes + (state->distcode - state->codes);
1361 }
1362 copy->next = copy->codes + (state->next - state->codes);
1363 if (window != Z_NULL) {
1364 wsize = 1U << state->wbits;
1365 zmemcpy(window, state->window, wsize);
1366 }
1367 copy->window = window;
1368 dest->state = (struct internal_state FAR *)copy;
1369 return Z_OK;
1370 }
1371