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