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