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