inflate.c revision 1.5 1 /* $NetBSD: inflate.c,v 1.5 2017/01/10 01:27:41 christos 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 (inflateStateCheck(strm) || strm->next_out == Z_NULL ||
648 (strm->next_in == Z_NULL && strm->avail_in != 0))
649 return Z_STREAM_ERROR;
650
651 state = (struct inflate_state FAR *)strm->state;
652 if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */
653 LOAD();
654 in = have;
655 out = left;
656 ret = Z_OK;
657 for (;;)
658 switch (state->mode) {
659 case HEAD:
660 if (state->wrap == 0) {
661 state->mode = TYPEDO;
662 break;
663 }
664 NEEDBITS(16);
665 #ifdef GUNZIP
666 if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */
667 if (state->wbits == 0)
668 state->wbits = 15;
669 state->check = crc32(0L, Z_NULL, 0);
670 CRC2(state->check, hold);
671 INITBITS();
672 state->mode = FLAGS;
673 break;
674 }
675 state->flags = 0; /* expect zlib header */
676 if (state->head != Z_NULL)
677 state->head->done = -1;
678 if (!(state->wrap & 1) || /* check if zlib header allowed */
679 #else
680 if (
681 #endif
682 ((BITS(8) << 8) + (hold >> 8)) % 31) {
683 strm->msg = __UNCONST("incorrect header check");
684 state->mode = BAD;
685 break;
686 }
687 if (BITS(4) != Z_DEFLATED) {
688 strm->msg = __UNCONST("unknown compression method");
689 state->mode = BAD;
690 break;
691 }
692 DROPBITS(4);
693 len = BITS(4) + 8;
694 if (state->wbits == 0)
695 state->wbits = len;
696 if (len > 15 || len > state->wbits) {
697 strm->msg = __UNCONST("invalid window size");
698 state->mode = BAD;
699 break;
700 }
701 state->dmax = 1U << len;
702 Tracev((stderr, "inflate: zlib header ok\n"));
703 strm->adler = state->check = adler32(0L, Z_NULL, 0);
704 state->mode = hold & 0x200 ? DICTID : TYPE;
705 INITBITS();
706 break;
707 #ifdef GUNZIP
708 case FLAGS:
709 NEEDBITS(16);
710 state->flags = (int)(hold);
711 if ((state->flags & 0xff) != Z_DEFLATED) {
712 strm->msg = __UNCONST("unknown compression method");
713 state->mode = BAD;
714 break;
715 }
716 if (state->flags & 0xe000) {
717 strm->msg = __UNCONST("unknown header flags set");
718 state->mode = BAD;
719 break;
720 }
721 if (state->head != Z_NULL)
722 state->head->text = (int)((hold >> 8) & 1);
723 if ((state->flags & 0x0200) && (state->wrap & 4))
724 CRC2(state->check, hold);
725 INITBITS();
726 state->mode = TIME;
727 case TIME:
728 NEEDBITS(32);
729 if (state->head != Z_NULL)
730 state->head->time = hold;
731 if ((state->flags & 0x0200) && (state->wrap & 4))
732 CRC4(state->check, hold);
733 INITBITS();
734 state->mode = OS;
735 case OS:
736 NEEDBITS(16);
737 if (state->head != Z_NULL) {
738 state->head->xflags = (int)(hold & 0xff);
739 state->head->os = (int)(hold >> 8);
740 }
741 if ((state->flags & 0x0200) && (state->wrap & 4))
742 CRC2(state->check, hold);
743 INITBITS();
744 state->mode = EXLEN;
745 case EXLEN:
746 if (state->flags & 0x0400) {
747 NEEDBITS(16);
748 state->length = (unsigned)(hold);
749 if (state->head != Z_NULL)
750 state->head->extra_len = (unsigned)hold;
751 if ((state->flags & 0x0200) && (state->wrap & 4))
752 CRC2(state->check, hold);
753 INITBITS();
754 }
755 else if (state->head != Z_NULL)
756 state->head->extra = Z_NULL;
757 state->mode = EXTRA;
758 case EXTRA:
759 if (state->flags & 0x0400) {
760 copy = state->length;
761 if (copy > have) copy = have;
762 if (copy) {
763 if (state->head != Z_NULL &&
764 state->head->extra != Z_NULL) {
765 len = state->head->extra_len - state->length;
766 Assert (next != NULL, "next is null");
767 zmemcpy(state->head->extra + len, next,
768 len + copy > state->head->extra_max ?
769 state->head->extra_max - len : copy);
770 }
771 if ((state->flags & 0x0200) && (state->wrap & 4))
772 state->check = crc32(state->check, next, copy);
773 have -= copy;
774 next += copy;
775 state->length -= copy;
776 }
777 if (state->length) goto inf_leave;
778 }
779 state->length = 0;
780 state->mode = NAME;
781 case NAME:
782 if (state->flags & 0x0800) {
783 if (have == 0) goto inf_leave;
784 copy = 0;
785 do {
786 len = (unsigned)(next[copy++]);
787 if (state->head != Z_NULL &&
788 state->head->name != Z_NULL &&
789 state->length < state->head->name_max)
790 state->head->name[state->length++] = (Bytef)len;
791 } while (len && copy < have);
792 if ((state->flags & 0x0200) && (state->wrap & 4))
793 state->check = crc32(state->check, next, copy);
794 have -= copy;
795 next += copy;
796 if (len) goto inf_leave;
797 }
798 else if (state->head != Z_NULL)
799 state->head->name = Z_NULL;
800 state->length = 0;
801 state->mode = COMMENT;
802 case COMMENT:
803 if (state->flags & 0x1000) {
804 if (have == 0) goto inf_leave;
805 copy = 0;
806 do {
807 len = (unsigned)(next[copy++]);
808 if (state->head != Z_NULL &&
809 state->head->comment != Z_NULL &&
810 state->length < state->head->comm_max)
811 state->head->comment[state->length++] = (Bytef)len;
812 } while (len && copy < have);
813 if ((state->flags & 0x0200) && (state->wrap & 4))
814 state->check = crc32(state->check, next, copy);
815 have -= copy;
816 next += copy;
817 if (len) goto inf_leave;
818 }
819 else if (state->head != Z_NULL)
820 state->head->comment = Z_NULL;
821 state->mode = HCRC;
822 case HCRC:
823 if (state->flags & 0x0200) {
824 NEEDBITS(16);
825 if ((state->wrap & 4) && hold != (state->check & 0xffff)) {
826 strm->msg = __UNCONST("header crc mismatch");
827 state->mode = BAD;
828 break;
829 }
830 INITBITS();
831 }
832 if (state->head != Z_NULL) {
833 state->head->hcrc = (int)((state->flags >> 9) & 1);
834 state->head->done = 1;
835 }
836 strm->adler = state->check = crc32(0L, Z_NULL, 0);
837 state->mode = TYPE;
838 break;
839 #endif
840 case DICTID:
841 NEEDBITS(32);
842 strm->adler = state->check = ZSWAP32(hold);
843 INITBITS();
844 state->mode = DICT;
845 case DICT:
846 if (state->havedict == 0) {
847 RESTORE();
848 return Z_NEED_DICT;
849 }
850 strm->adler = state->check = adler32(0L, Z_NULL, 0);
851 state->mode = TYPE;
852 case TYPE:
853 if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
854 case TYPEDO:
855 if (state->last) {
856 BYTEBITS();
857 state->mode = CHECK;
858 break;
859 }
860 NEEDBITS(3);
861 state->last = BITS(1);
862 DROPBITS(1);
863 switch (BITS(2)) {
864 case 0: /* stored block */
865 Tracev((stderr, "inflate: stored block%s\n",
866 state->last ? " (last)" : ""));
867 state->mode = STORED;
868 break;
869 case 1: /* fixed block */
870 fixedtables(state);
871 Tracev((stderr, "inflate: fixed codes block%s\n",
872 state->last ? " (last)" : ""));
873 state->mode = LEN_; /* decode codes */
874 if (flush == Z_TREES) {
875 DROPBITS(2);
876 goto inf_leave;
877 }
878 break;
879 case 2: /* dynamic block */
880 Tracev((stderr, "inflate: dynamic codes block%s\n",
881 state->last ? " (last)" : ""));
882 state->mode = TABLE;
883 break;
884 case 3:
885 strm->msg = __UNCONST("invalid block type");
886 state->mode = BAD;
887 }
888 DROPBITS(2);
889 break;
890 case STORED:
891 BYTEBITS(); /* go to byte boundary */
892 NEEDBITS(32);
893 if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
894 strm->msg = __UNCONST("invalid stored block lengths");
895 state->mode = BAD;
896 break;
897 }
898 state->length = (unsigned)hold & 0xffff;
899 Tracev((stderr, "inflate: stored length %u\n",
900 state->length));
901 INITBITS();
902 state->mode = COPY_;
903 if (flush == Z_TREES) goto inf_leave;
904 case COPY_:
905 state->mode = COPY;
906 case COPY:
907 copy = state->length;
908 if (copy) {
909 if (copy > have) copy = have;
910 if (copy > left) copy = left;
911 if (copy == 0) goto inf_leave;
912 zmemcpy(put, next, copy);
913 have -= copy;
914 next += copy;
915 left -= copy;
916 put += copy;
917 state->length -= copy;
918 break;
919 }
920 Tracev((stderr, "inflate: stored end\n"));
921 state->mode = TYPE;
922 break;
923 case TABLE:
924 NEEDBITS(14);
925 state->nlen = BITS(5) + 257;
926 DROPBITS(5);
927 state->ndist = BITS(5) + 1;
928 DROPBITS(5);
929 state->ncode = BITS(4) + 4;
930 DROPBITS(4);
931 #ifndef PKZIP_BUG_WORKAROUND
932 if (state->nlen > 286 || state->ndist > 30) {
933 strm->msg = __UNCONST("too many length or distance symbols");
934 state->mode = BAD;
935 break;
936 }
937 #endif
938 Tracev((stderr, "inflate: table sizes ok\n"));
939 state->have = 0;
940 state->mode = LENLENS;
941 case LENLENS:
942 while (state->have < state->ncode) {
943 NEEDBITS(3);
944 state->lens[order[state->have++]] = (unsigned short)BITS(3);
945 DROPBITS(3);
946 }
947 while (state->have < 19)
948 state->lens[order[state->have++]] = 0;
949 state->next = state->codes;
950 state->lencode = (const code FAR *)(state->next);
951 state->lenbits = 7;
952 ret = inflate_table(CODES, state->lens, 19, &(state->next),
953 &(state->lenbits), state->work);
954 if (ret) {
955 strm->msg = __UNCONST("invalid code lengths set");
956 state->mode = BAD;
957 break;
958 }
959 Tracev((stderr, "inflate: code lengths ok\n"));
960 state->have = 0;
961 state->mode = CODELENS;
962 case CODELENS:
963 while (state->have < state->nlen + state->ndist) {
964 for (;;) {
965 here = state->lencode[BITS(state->lenbits)];
966 if ((unsigned)(here.bits) <= bits) break;
967 PULLBYTE();
968 }
969 if (here.val < 16) {
970 DROPBITS(here.bits);
971 state->lens[state->have++] = here.val;
972 }
973 else {
974 if (here.val == 16) {
975 NEEDBITS(here.bits + 2);
976 DROPBITS(here.bits);
977 if (state->have == 0) {
978 strm->msg = __UNCONST("invalid bit length repeat");
979 state->mode = BAD;
980 break;
981 }
982 len = state->lens[state->have - 1];
983 copy = 3 + BITS(2);
984 DROPBITS(2);
985 }
986 else if (here.val == 17) {
987 NEEDBITS(here.bits + 3);
988 DROPBITS(here.bits);
989 len = 0;
990 copy = 3 + BITS(3);
991 DROPBITS(3);
992 }
993 else {
994 NEEDBITS(here.bits + 7);
995 DROPBITS(here.bits);
996 len = 0;
997 copy = 11 + BITS(7);
998 DROPBITS(7);
999 }
1000 if (state->have + copy > state->nlen + state->ndist) {
1001 strm->msg = __UNCONST("invalid bit length repeat");
1002 state->mode = BAD;
1003 break;
1004 }
1005 while (copy--)
1006 state->lens[state->have++] = (unsigned short)len;
1007 }
1008 }
1009
1010 /* handle error breaks in while */
1011 if (state->mode == BAD) break;
1012
1013 /* check for end-of-block code (better have one) */
1014 if (state->lens[256] == 0) {
1015 strm->msg = __UNCONST("invalid code -- missing end-of-block");
1016 state->mode = BAD;
1017 break;
1018 }
1019
1020 /* build code tables -- note: do not change the lenbits or distbits
1021 values here (9 and 6) without reading the comments in inftrees.h
1022 concerning the ENOUGH constants, which depend on those values */
1023 state->next = state->codes;
1024 state->lencode = (const code FAR *)(state->next);
1025 state->lenbits = 9;
1026 ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
1027 &(state->lenbits), state->work);
1028 if (ret) {
1029 strm->msg = __UNCONST("invalid literal/lengths set");
1030 state->mode = BAD;
1031 break;
1032 }
1033 state->distcode = (const code FAR *)(state->next);
1034 state->distbits = 6;
1035 ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
1036 &(state->next), &(state->distbits), state->work);
1037 if (ret) {
1038 strm->msg = __UNCONST("invalid distances set");
1039 state->mode = BAD;
1040 break;
1041 }
1042 Tracev((stderr, "inflate: codes ok\n"));
1043 state->mode = LEN_;
1044 if (flush == Z_TREES) goto inf_leave;
1045 case LEN_:
1046 state->mode = LEN;
1047 case LEN:
1048 if (have >= 6 && left >= 258) {
1049 RESTORE();
1050 inflate_fast(strm, out);
1051 LOAD();
1052 if (state->mode == TYPE)
1053 state->back = -1;
1054 break;
1055 }
1056 state->back = 0;
1057 for (;;) {
1058 here = state->lencode[BITS(state->lenbits)];
1059 if ((unsigned)(here.bits) <= bits) break;
1060 PULLBYTE();
1061 }
1062 if (here.op && (here.op & 0xf0) == 0) {
1063 last = here;
1064 for (;;) {
1065 here = state->lencode[last.val +
1066 (BITS(last.bits + last.op) >> last.bits)];
1067 if ((unsigned)(last.bits + here.bits) <= bits) break;
1068 PULLBYTE();
1069 }
1070 DROPBITS(last.bits);
1071 state->back += last.bits;
1072 }
1073 DROPBITS(here.bits);
1074 state->back += here.bits;
1075 state->length = (unsigned)here.val;
1076 if ((int)(here.op) == 0) {
1077 Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
1078 "inflate: literal '%c'\n" :
1079 "inflate: literal 0x%02x\n", here.val));
1080 state->mode = LIT;
1081 break;
1082 }
1083 if (here.op & 32) {
1084 Tracevv((stderr, "inflate: end of block\n"));
1085 state->back = -1;
1086 state->mode = TYPE;
1087 break;
1088 }
1089 if (here.op & 64) {
1090 strm->msg = __UNCONST("invalid literal/length code");
1091 state->mode = BAD;
1092 break;
1093 }
1094 state->extra = (unsigned)(here.op) & 15;
1095 state->mode = LENEXT;
1096 case LENEXT:
1097 if (state->extra) {
1098 NEEDBITS(state->extra);
1099 state->length += BITS(state->extra);
1100 DROPBITS(state->extra);
1101 state->back += state->extra;
1102 }
1103 Tracevv((stderr, "inflate: length %u\n", state->length));
1104 state->was = state->length;
1105 state->mode = DIST;
1106 case DIST:
1107 for (;;) {
1108 here = state->distcode[BITS(state->distbits)];
1109 if ((unsigned)(here.bits) <= bits) break;
1110 PULLBYTE();
1111 }
1112 if ((here.op & 0xf0) == 0) {
1113 last = here;
1114 for (;;) {
1115 here = state->distcode[last.val +
1116 (BITS(last.bits + last.op) >> last.bits)];
1117 if ((unsigned)(last.bits + here.bits) <= bits) break;
1118 PULLBYTE();
1119 }
1120 DROPBITS(last.bits);
1121 state->back += last.bits;
1122 }
1123 DROPBITS(here.bits);
1124 state->back += here.bits;
1125 if (here.op & 64) {
1126 strm->msg = __UNCONST("invalid distance code");
1127 state->mode = BAD;
1128 break;
1129 }
1130 state->offset = (unsigned)here.val;
1131 state->extra = (unsigned)(here.op) & 15;
1132 state->mode = DISTEXT;
1133 case DISTEXT:
1134 if (state->extra) {
1135 NEEDBITS(state->extra);
1136 state->offset += BITS(state->extra);
1137 DROPBITS(state->extra);
1138 state->back += state->extra;
1139 }
1140 #ifdef INFLATE_STRICT
1141 if (state->offset > state->dmax) {
1142 strm->msg = __UNCONST("invalid distance too far back");
1143 state->mode = BAD;
1144 break;
1145 }
1146 #endif
1147 Tracevv((stderr, "inflate: distance %u\n", state->offset));
1148 state->mode = MATCH;
1149 case MATCH:
1150 if (left == 0) goto inf_leave;
1151 copy = out - left;
1152 if (state->offset > copy) { /* copy from window */
1153 copy = state->offset - copy;
1154 if (copy > state->whave) {
1155 if (state->sane) {
1156 strm->msg = __UNCONST("invalid distance too far back");
1157 state->mode = BAD;
1158 break;
1159 }
1160 #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1161 Trace((stderr, "inflate.c too far\n"));
1162 copy -= state->whave;
1163 if (copy > state->length) copy = state->length;
1164 if (copy > left) copy = left;
1165 left -= copy;
1166 state->length -= copy;
1167 do {
1168 *put++ = 0;
1169 } while (--copy);
1170 if (state->length == 0) state->mode = LEN;
1171 break;
1172 #endif
1173 }
1174 if (copy > state->wnext) {
1175 copy -= state->wnext;
1176 from = state->window + (state->wsize - copy);
1177 }
1178 else
1179 from = state->window + (state->wnext - copy);
1180 if (copy > state->length) copy = state->length;
1181 }
1182 else { /* copy from output */
1183 from = put - state->offset;
1184 copy = state->length;
1185 }
1186 if (copy > left) copy = left;
1187 left -= copy;
1188 state->length -= copy;
1189 do {
1190 *put++ = *from++;
1191 } while (--copy);
1192 if (state->length == 0) state->mode = LEN;
1193 break;
1194 case LIT:
1195 if (left == 0) goto inf_leave;
1196 *put++ = (unsigned char)(state->length);
1197 left--;
1198 state->mode = LEN;
1199 break;
1200 case CHECK:
1201 if (state->wrap) {
1202 NEEDBITS(32);
1203 out -= left;
1204 strm->total_out += out;
1205 state->total += out;
1206 if ((state->wrap & 4) && out)
1207 strm->adler = state->check =
1208 UPDATE(state->check, put - out, out);
1209 out = left;
1210 if ((state->wrap & 4) && (
1211 #ifdef GUNZIP
1212 state->flags ? hold :
1213 #endif
1214 ZSWAP32(hold)) != state->check) {
1215 strm->msg = __UNCONST("incorrect data check");
1216 state->mode = BAD;
1217 break;
1218 }
1219 INITBITS();
1220 Tracev((stderr, "inflate: check matches trailer\n"));
1221 }
1222 #ifdef GUNZIP
1223 state->mode = LENGTH;
1224 case LENGTH:
1225 if (state->wrap && state->flags) {
1226 NEEDBITS(32);
1227 if (hold != (state->total & 0xffffffffUL)) {
1228 strm->msg = __UNCONST("incorrect length check");
1229 state->mode = BAD;
1230 break;
1231 }
1232 INITBITS();
1233 Tracev((stderr, "inflate: length matches trailer\n"));
1234 }
1235 #endif
1236 state->mode = DONE;
1237 case DONE:
1238 ret = Z_STREAM_END;
1239 goto inf_leave;
1240 case BAD:
1241 ret = Z_DATA_ERROR;
1242 goto inf_leave;
1243 case MEM:
1244 return Z_MEM_ERROR;
1245 case SYNC:
1246 default:
1247 return Z_STREAM_ERROR;
1248 }
1249
1250 /*
1251 Return from inflate(), updating the total counts and the check value.
1252 If there was no progress during the inflate() call, return a buffer
1253 error. Call updatewindow() to create and/or update the window state.
1254 Note: a memory error from inflate() is non-recoverable.
1255 */
1256 inf_leave:
1257 RESTORE();
1258 if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
1259 (state->mode < CHECK || flush != Z_FINISH)))
1260 if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {
1261 state->mode = MEM;
1262 return Z_MEM_ERROR;
1263 }
1264 in -= strm->avail_in;
1265 out -= strm->avail_out;
1266 strm->total_in += in;
1267 strm->total_out += out;
1268 state->total += out;
1269 if ((state->wrap & 4) && out)
1270 strm->adler = state->check =
1271 UPDATE(state->check, strm->next_out - out, out);
1272 strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
1273 (state->mode == TYPE ? 128 : 0) +
1274 (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
1275 if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
1276 ret = Z_BUF_ERROR;
1277 return ret;
1278 }
1279
1280 int ZEXPORT inflateEnd(strm)
1281 z_streamp strm;
1282 {
1283 struct inflate_state FAR *state;
1284 if (inflateStateCheck(strm))
1285 return Z_STREAM_ERROR;
1286 state = (struct inflate_state FAR *)strm->state;
1287 if (state->window != Z_NULL) ZFREE(strm, state->window);
1288 ZFREE(strm, strm->state);
1289 strm->state = Z_NULL;
1290 Tracev((stderr, "inflate: end\n"));
1291 return Z_OK;
1292 }
1293
1294 int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength)
1295 z_streamp strm;
1296 Bytef *dictionary;
1297 uInt *dictLength;
1298 {
1299 struct inflate_state FAR *state;
1300
1301 /* check state */
1302 if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1303 state = (struct inflate_state FAR *)strm->state;
1304
1305 /* copy dictionary */
1306 if (state->whave && dictionary != Z_NULL) {
1307 zmemcpy(dictionary, state->window + state->wnext,
1308 state->whave - state->wnext);
1309 zmemcpy(dictionary + state->whave - state->wnext,
1310 state->window, state->wnext);
1311 }
1312 if (dictLength != Z_NULL)
1313 *dictLength = state->whave;
1314 return Z_OK;
1315 }
1316
1317 int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
1318 z_streamp strm;
1319 const Bytef *dictionary;
1320 uInt dictLength;
1321 {
1322 struct inflate_state FAR *state;
1323 unsigned long dictid;
1324 int ret;
1325
1326 /* check state */
1327 if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1328 state = (struct inflate_state FAR *)strm->state;
1329 if (state->wrap != 0 && state->mode != DICT)
1330 return Z_STREAM_ERROR;
1331
1332 /* check for correct dictionary identifier */
1333 if (state->mode == DICT) {
1334 dictid = adler32(0L, Z_NULL, 0);
1335 dictid = adler32(dictid, dictionary, dictLength);
1336 if (dictid != state->check)
1337 return Z_DATA_ERROR;
1338 }
1339
1340 /* copy dictionary to window using updatewindow(), which will amend the
1341 existing dictionary if appropriate */
1342 ret = updatewindow(strm, dictionary + dictLength, dictLength);
1343 if (ret) {
1344 state->mode = MEM;
1345 return Z_MEM_ERROR;
1346 }
1347 state->havedict = 1;
1348 Tracev((stderr, "inflate: dictionary set\n"));
1349 return Z_OK;
1350 }
1351
1352 int ZEXPORT inflateGetHeader(strm, head)
1353 z_streamp strm;
1354 gz_headerp head;
1355 {
1356 struct inflate_state FAR *state;
1357
1358 /* check state */
1359 if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1360 state = (struct inflate_state FAR *)strm->state;
1361 if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
1362
1363 /* save header structure */
1364 state->head = head;
1365 head->done = 0;
1366 return Z_OK;
1367 }
1368
1369 /*
1370 Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found
1371 or when out of input. When called, *have is the number of pattern bytes
1372 found in order so far, in 0..3. On return *have is updated to the new
1373 state. If on return *have equals four, then the pattern was found and the
1374 return value is how many bytes were read including the last byte of the
1375 pattern. If *have is less than four, then the pattern has not been found
1376 yet and the return value is len. In the latter case, syncsearch() can be
1377 called again with more data and the *have state. *have is initialized to
1378 zero for the first call.
1379 */
1380 local unsigned syncsearch(have, buf, len)
1381 unsigned FAR *have;
1382 const unsigned char FAR *buf;
1383 unsigned len;
1384 {
1385 unsigned got;
1386 unsigned next;
1387
1388 got = *have;
1389 next = 0;
1390 while (next < len && got < 4) {
1391 if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
1392 got++;
1393 else if (buf[next])
1394 got = 0;
1395 else
1396 got = 4 - got;
1397 next++;
1398 }
1399 *have = got;
1400 return next;
1401 }
1402
1403 int ZEXPORT inflateSync(strm)
1404 z_streamp strm;
1405 {
1406 unsigned len; /* number of bytes to look at or looked at */
1407 unsigned long in, out; /* temporary to save total_in and total_out */
1408 unsigned char buf[4]; /* to restore bit buffer to byte string */
1409 struct inflate_state FAR *state;
1410
1411 /* check parameters */
1412 if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1413 state = (struct inflate_state FAR *)strm->state;
1414 if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
1415
1416 /* if first time, start search in bit buffer */
1417 if (state->mode != SYNC) {
1418 state->mode = SYNC;
1419 state->hold <<= state->bits & 7;
1420 state->bits -= state->bits & 7;
1421 len = 0;
1422 while (state->bits >= 8) {
1423 buf[len++] = (unsigned char)(state->hold);
1424 state->hold >>= 8;
1425 state->bits -= 8;
1426 }
1427 state->have = 0;
1428 syncsearch(&(state->have), buf, len);
1429 }
1430
1431 /* search available input */
1432 len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
1433 strm->avail_in -= len;
1434 strm->next_in += len;
1435 strm->total_in += len;
1436
1437 /* return no joy or set up to restart inflate() on a new block */
1438 if (state->have != 4) return Z_DATA_ERROR;
1439 in = strm->total_in; out = strm->total_out;
1440 inflateReset(strm);
1441 strm->total_in = in; strm->total_out = out;
1442 state->mode = TYPE;
1443 return Z_OK;
1444 }
1445
1446 /*
1447 Returns true if inflate is currently at the end of a block generated by
1448 Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
1449 implementation to provide an additional safety check. PPP uses
1450 Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
1451 block. When decompressing, PPP checks that at the end of input packet,
1452 inflate is waiting for these length bytes.
1453 */
1454 int ZEXPORT inflateSyncPoint(strm)
1455 z_streamp strm;
1456 {
1457 struct inflate_state FAR *state;
1458
1459 if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1460 state = (struct inflate_state FAR *)strm->state;
1461 return state->mode == STORED && state->bits == 0;
1462 }
1463
1464 int ZEXPORT inflateCopy(dest, source)
1465 z_streamp dest;
1466 z_streamp source;
1467 {
1468 struct inflate_state FAR *state;
1469 struct inflate_state FAR *copy;
1470 unsigned char FAR *window;
1471 unsigned wsize;
1472
1473 /* check input */
1474 if (inflateStateCheck(source) || dest == Z_NULL)
1475 return Z_STREAM_ERROR;
1476 state = (struct inflate_state FAR *)source->state;
1477
1478 /* allocate space */
1479 copy = (struct inflate_state FAR *)
1480 ZALLOC(source, 1, sizeof(struct inflate_state));
1481 if (copy == Z_NULL) return Z_MEM_ERROR;
1482 window = Z_NULL;
1483 if (state->window != Z_NULL) {
1484 window = (unsigned char FAR *)
1485 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
1486 if (window == Z_NULL) {
1487 ZFREE(source, copy);
1488 return Z_MEM_ERROR;
1489 }
1490 }
1491
1492 /* copy state */
1493 zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
1494 zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));
1495 copy->strm = dest;
1496 if (state->lencode >= state->codes &&
1497 state->lencode <= state->codes + ENOUGH - 1) {
1498 copy->lencode = copy->codes + (state->lencode - state->codes);
1499 copy->distcode = copy->codes + (state->distcode - state->codes);
1500 }
1501 copy->next = copy->codes + (state->next - state->codes);
1502 if (window != Z_NULL) {
1503 wsize = 1U << state->wbits;
1504 zmemcpy(window, state->window, wsize);
1505 }
1506 copy->window = window;
1507 dest->state = (struct internal_state FAR *)copy;
1508 return Z_OK;
1509 }
1510
1511 int ZEXPORT inflateUndermine(strm, subvert)
1512 z_streamp strm;
1513 int subvert;
1514 {
1515 struct inflate_state FAR *state;
1516
1517 if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1518 state = (struct inflate_state FAR *)strm->state;
1519 #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1520 state->sane = !subvert;
1521 return Z_OK;
1522 #else
1523 (void)subvert;
1524 state->sane = 1;
1525 return Z_DATA_ERROR;
1526 #endif
1527 }
1528
1529 int ZEXPORT inflateValidate(strm, check)
1530 z_streamp strm;
1531 int check;
1532 {
1533 struct inflate_state FAR *state;
1534
1535 if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1536 state = (struct inflate_state FAR *)strm->state;
1537 if (check)
1538 state->wrap |= 4;
1539 else
1540 state->wrap &= ~4;
1541 return Z_OK;
1542 }
1543
1544 long ZEXPORT inflateMark(strm)
1545 z_streamp strm;
1546 {
1547 struct inflate_state FAR *state;
1548
1549 if (inflateStateCheck(strm))
1550 return -(1L << 16);
1551 state = (struct inflate_state FAR *)strm->state;
1552 return (long)(((unsigned long)((long)state->back)) << 16) +
1553 (state->mode == COPY ? state->length :
1554 (state->mode == MATCH ? state->was - state->length : 0));
1555 }
1556
1557 unsigned long ZEXPORT inflateCodesUsed(strm)
1558 z_streamp strm;
1559 {
1560 struct inflate_state FAR *state;
1561 if (inflateStateCheck(strm)) return (unsigned long)-1;
1562 state = (struct inflate_state FAR *)strm->state;
1563 return (unsigned long)(state->next - state->codes);
1564 }
1565