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