xref: /netbsd-src/common/dist/zlib/inflate.c (revision 181254a7b1bdde6873432bffef2d2decc4b5c22f)
1 /*	$NetBSD: inflate.c,v 1.6 2017/11/12 07:55:05 tsutsui 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