xref: /openbmc/u-boot/lib/zlib/inflate.c (revision 3e4d27b06d7484040355e22eec2cbce7335d6dab)
1e89516f0SMike Frysinger /* inflate.c -- zlib decompression
2e89516f0SMike Frysinger  * Copyright (C) 1995-2005 Mark Adler
3e89516f0SMike Frysinger  * For conditions of distribution and use, see copyright notice in zlib.h
4e89516f0SMike Frysinger  */
5e89516f0SMike Frysinger local void fixedtables OF((struct inflate_state FAR *state));
6e89516f0SMike Frysinger local int updatewindow OF((z_streamp strm, unsigned out));
7e89516f0SMike Frysinger 
inflateReset(z_streamp strm)8*ee820b5eSKim Phillips int ZEXPORT inflateReset(z_streamp strm)
9e89516f0SMike Frysinger {
10e89516f0SMike Frysinger     struct inflate_state FAR *state;
11e89516f0SMike Frysinger 
12e89516f0SMike Frysinger     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
13e89516f0SMike Frysinger     state = (struct inflate_state FAR *)strm->state;
14e89516f0SMike Frysinger     strm->total_in = strm->total_out = state->total = 0;
15e89516f0SMike Frysinger     strm->msg = Z_NULL;
16e89516f0SMike Frysinger     strm->adler = 1;        /* to support ill-conceived Java test suite */
17e89516f0SMike Frysinger     state->mode = HEAD;
18e89516f0SMike Frysinger     state->last = 0;
19e89516f0SMike Frysinger     state->havedict = 0;
20e89516f0SMike Frysinger     state->dmax = 32768U;
21e89516f0SMike Frysinger     state->head = Z_NULL;
22e89516f0SMike Frysinger     state->wsize = 0;
23e89516f0SMike Frysinger     state->whave = 0;
24e89516f0SMike Frysinger     state->write = 0;
25e89516f0SMike Frysinger     state->hold = 0;
26e89516f0SMike Frysinger     state->bits = 0;
27e89516f0SMike Frysinger     state->lencode = state->distcode = state->next = state->codes;
28e89516f0SMike Frysinger     WATCHDOG_RESET();
29e89516f0SMike Frysinger     Tracev((stderr, "inflate: reset\n"));
30e89516f0SMike Frysinger     return Z_OK;
31e89516f0SMike Frysinger }
32e89516f0SMike Frysinger 
inflateInit2_(z_streamp strm,int windowBits,const char * version,int stream_size)33*ee820b5eSKim Phillips int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, const char *version,
34*ee820b5eSKim Phillips 			  int stream_size)
35e89516f0SMike Frysinger {
36e89516f0SMike Frysinger     struct inflate_state FAR *state;
37e89516f0SMike Frysinger 
38e89516f0SMike Frysinger     if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
39e89516f0SMike Frysinger         stream_size != (int)(sizeof(z_stream)))
40e89516f0SMike Frysinger         return Z_VERSION_ERROR;
41e89516f0SMike Frysinger     if (strm == Z_NULL) return Z_STREAM_ERROR;
42e89516f0SMike Frysinger     strm->msg = Z_NULL;                 /* in case we return an error */
43e89516f0SMike Frysinger     if (strm->zalloc == (alloc_func)0) {
44e89516f0SMike Frysinger         strm->zalloc = zcalloc;
45e89516f0SMike Frysinger         strm->opaque = (voidpf)0;
46e89516f0SMike Frysinger     }
47e89516f0SMike Frysinger     if (strm->zfree == (free_func)0) strm->zfree = zcfree;
48e89516f0SMike Frysinger     state = (struct inflate_state FAR *)
49e89516f0SMike Frysinger             ZALLOC(strm, 1, sizeof(struct inflate_state));
50e89516f0SMike Frysinger     if (state == Z_NULL) return Z_MEM_ERROR;
51e89516f0SMike Frysinger     Tracev((stderr, "inflate: allocated\n"));
52e89516f0SMike Frysinger     strm->state = (struct internal_state FAR *)state;
53e89516f0SMike Frysinger     if (windowBits < 0) {
54e89516f0SMike Frysinger         state->wrap = 0;
55e89516f0SMike Frysinger         windowBits = -windowBits;
56e89516f0SMike Frysinger     }
57e89516f0SMike Frysinger     else {
58e89516f0SMike Frysinger         state->wrap = (windowBits >> 4) + 1;
59e89516f0SMike Frysinger #ifdef GUNZIP
60e89516f0SMike Frysinger         if (windowBits < 48) windowBits &= 15;
61e89516f0SMike Frysinger #endif
62e89516f0SMike Frysinger     }
63e89516f0SMike Frysinger     if (windowBits < 8 || windowBits > 15) {
64e89516f0SMike Frysinger         ZFREE(strm, state);
65e89516f0SMike Frysinger         strm->state = Z_NULL;
66e89516f0SMike Frysinger         return Z_STREAM_ERROR;
67e89516f0SMike Frysinger     }
68e89516f0SMike Frysinger     state->wbits = (unsigned)windowBits;
69e89516f0SMike Frysinger     state->window = Z_NULL;
70e89516f0SMike Frysinger     return inflateReset(strm);
71e89516f0SMike Frysinger }
72e89516f0SMike Frysinger 
inflateInit_(z_streamp strm,const char * version,int stream_size)73*ee820b5eSKim Phillips int ZEXPORT inflateInit_(z_streamp strm, const char *version, int stream_size)
74e89516f0SMike Frysinger {
75e89516f0SMike Frysinger     return inflateInit2_(strm, DEF_WBITS, version, stream_size);
76e89516f0SMike Frysinger }
77e89516f0SMike Frysinger 
fixedtables(struct inflate_state FAR * state)78*ee820b5eSKim Phillips local void fixedtables(struct inflate_state FAR *state)
79e89516f0SMike Frysinger {
80e89516f0SMike Frysinger     state->lencode = lenfix;
81e89516f0SMike Frysinger     state->lenbits = 9;
82e89516f0SMike Frysinger     state->distcode = distfix;
83e89516f0SMike Frysinger     state->distbits = 5;
84e89516f0SMike Frysinger }
85e89516f0SMike Frysinger 
86e89516f0SMike Frysinger /*
87e89516f0SMike Frysinger    Update the window with the last wsize (normally 32K) bytes written before
88e89516f0SMike Frysinger    returning.  If window does not exist yet, create it.  This is only called
89e89516f0SMike Frysinger    when a window is already in use, or when output has been written during this
90e89516f0SMike Frysinger    inflate call, but the end of the deflate stream has not been reached yet.
91e89516f0SMike Frysinger    It is also called to create a window for dictionary data when a dictionary
92e89516f0SMike Frysinger    is loaded.
93e89516f0SMike Frysinger 
94e89516f0SMike Frysinger    Providing output buffers larger than 32K to inflate() should provide a speed
95e89516f0SMike Frysinger    advantage, since only the last 32K of output is copied to the sliding window
96e89516f0SMike Frysinger    upon return from inflate(), and since all distances after the first 32K of
97e89516f0SMike Frysinger    output will fall in the output data, making match copies simpler and faster.
98e89516f0SMike Frysinger    The advantage may be dependent on the size of the processor's data caches.
99e89516f0SMike Frysinger  */
updatewindow(z_streamp strm,unsigned out)100*ee820b5eSKim Phillips local int updatewindow(z_streamp strm, unsigned out)
101e89516f0SMike Frysinger {
102e89516f0SMike Frysinger     struct inflate_state FAR *state;
103e89516f0SMike Frysinger     unsigned copy, dist;
104e89516f0SMike Frysinger 
105e89516f0SMike Frysinger     state = (struct inflate_state FAR *)strm->state;
106e89516f0SMike Frysinger 
107e89516f0SMike Frysinger     /* if it hasn't been done already, allocate space for the window */
108e89516f0SMike Frysinger     if (state->window == Z_NULL) {
109e89516f0SMike Frysinger         state->window = (unsigned char FAR *)
110e89516f0SMike Frysinger                         ZALLOC(strm, 1U << state->wbits,
111e89516f0SMike Frysinger                                sizeof(unsigned char));
112e89516f0SMike Frysinger         if (state->window == Z_NULL) return 1;
113e89516f0SMike Frysinger     }
114e89516f0SMike Frysinger 
115e89516f0SMike Frysinger     /* if window not in use yet, initialize */
116e89516f0SMike Frysinger     if (state->wsize == 0) {
117e89516f0SMike Frysinger         state->wsize = 1U << state->wbits;
118e89516f0SMike Frysinger         state->write = 0;
119e89516f0SMike Frysinger         state->whave = 0;
120e89516f0SMike Frysinger     }
121e89516f0SMike Frysinger 
122e89516f0SMike Frysinger     /* copy state->wsize or less output bytes into the circular window */
123e89516f0SMike Frysinger     copy = out - strm->avail_out;
124e89516f0SMike Frysinger     if (copy >= state->wsize) {
125e89516f0SMike Frysinger         zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);
126e89516f0SMike Frysinger         state->write = 0;
127e89516f0SMike Frysinger         state->whave = state->wsize;
128e89516f0SMike Frysinger     }
129e89516f0SMike Frysinger     else {
130e89516f0SMike Frysinger         dist = state->wsize - state->write;
131e89516f0SMike Frysinger         if (dist > copy) dist = copy;
132e89516f0SMike Frysinger         zmemcpy(state->window + state->write, strm->next_out - copy, dist);
133e89516f0SMike Frysinger         copy -= dist;
134e89516f0SMike Frysinger         if (copy) {
135e89516f0SMike Frysinger             zmemcpy(state->window, strm->next_out - copy, copy);
136e89516f0SMike Frysinger             state->write = copy;
137e89516f0SMike Frysinger             state->whave = state->wsize;
138e89516f0SMike Frysinger         }
139e89516f0SMike Frysinger         else {
140e89516f0SMike Frysinger             state->write += dist;
141e89516f0SMike Frysinger             if (state->write == state->wsize) state->write = 0;
142e89516f0SMike Frysinger             if (state->whave < state->wsize) state->whave += dist;
143e89516f0SMike Frysinger         }
144e89516f0SMike Frysinger     }
145e89516f0SMike Frysinger     return 0;
146e89516f0SMike Frysinger }
147e89516f0SMike Frysinger 
148e89516f0SMike Frysinger /* Macros for inflate(): */
149e89516f0SMike Frysinger 
150e89516f0SMike Frysinger /* check function to use adler32() for zlib or crc32() for gzip */
151e89516f0SMike Frysinger #ifdef GUNZIP
152e89516f0SMike Frysinger #  define UPDATE(check, buf, len) \
153e89516f0SMike Frysinger     (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
154e89516f0SMike Frysinger #else
155e89516f0SMike Frysinger #  define UPDATE(check, buf, len) adler32(check, buf, len)
156e89516f0SMike Frysinger #endif
157e89516f0SMike Frysinger 
158e89516f0SMike Frysinger /* check macros for header crc */
159e89516f0SMike Frysinger #ifdef GUNZIP
160e89516f0SMike Frysinger #  define CRC2(check, word) \
161e89516f0SMike Frysinger     do { \
162e89516f0SMike Frysinger         hbuf[0] = (unsigned char)(word); \
163e89516f0SMike Frysinger         hbuf[1] = (unsigned char)((word) >> 8); \
164e89516f0SMike Frysinger         check = crc32(check, hbuf, 2); \
165e89516f0SMike Frysinger     } while (0)
166e89516f0SMike Frysinger 
167e89516f0SMike Frysinger #  define CRC4(check, word) \
168e89516f0SMike Frysinger     do { \
169e89516f0SMike Frysinger         hbuf[0] = (unsigned char)(word); \
170e89516f0SMike Frysinger         hbuf[1] = (unsigned char)((word) >> 8); \
171e89516f0SMike Frysinger         hbuf[2] = (unsigned char)((word) >> 16); \
172e89516f0SMike Frysinger         hbuf[3] = (unsigned char)((word) >> 24); \
173e89516f0SMike Frysinger         check = crc32(check, hbuf, 4); \
174e89516f0SMike Frysinger     } while (0)
175e89516f0SMike Frysinger #endif
176e89516f0SMike Frysinger 
177e89516f0SMike Frysinger /* Load registers with state in inflate() for speed */
178e89516f0SMike Frysinger #define LOAD() \
179e89516f0SMike Frysinger     do { \
180e89516f0SMike Frysinger         put = strm->next_out; \
181e89516f0SMike Frysinger         left = strm->avail_out; \
182e89516f0SMike Frysinger         next = strm->next_in; \
183e89516f0SMike Frysinger         have = strm->avail_in; \
184e89516f0SMike Frysinger         hold = state->hold; \
185e89516f0SMike Frysinger         bits = state->bits; \
186e89516f0SMike Frysinger     } while (0)
187e89516f0SMike Frysinger 
188e89516f0SMike Frysinger /* Restore state from registers in inflate() */
189e89516f0SMike Frysinger #define RESTORE() \
190e89516f0SMike Frysinger     do { \
191e89516f0SMike Frysinger         strm->next_out = put; \
192e89516f0SMike Frysinger         strm->avail_out = left; \
193e89516f0SMike Frysinger         strm->next_in = next; \
194e89516f0SMike Frysinger         strm->avail_in = have; \
195e89516f0SMike Frysinger         state->hold = hold; \
196e89516f0SMike Frysinger         state->bits = bits; \
197e89516f0SMike Frysinger     } while (0)
198e89516f0SMike Frysinger 
199e89516f0SMike Frysinger /* Clear the input bit accumulator */
200e89516f0SMike Frysinger #define INITBITS() \
201e89516f0SMike Frysinger     do { \
202e89516f0SMike Frysinger         hold = 0; \
203e89516f0SMike Frysinger         bits = 0; \
204e89516f0SMike Frysinger     } while (0)
205e89516f0SMike Frysinger 
206e89516f0SMike Frysinger /* Get a byte of input into the bit accumulator, or return from inflate()
207e89516f0SMike Frysinger    if there is no input available. */
208e89516f0SMike Frysinger #define PULLBYTE() \
209e89516f0SMike Frysinger     do { \
210e89516f0SMike Frysinger         if (have == 0) goto inf_leave; \
211e89516f0SMike Frysinger         have--; \
212e89516f0SMike Frysinger         hold += (unsigned long)(*next++) << bits; \
213e89516f0SMike Frysinger         bits += 8; \
214e89516f0SMike Frysinger     } while (0)
215e89516f0SMike Frysinger 
216e89516f0SMike Frysinger /* Assure that there are at least n bits in the bit accumulator.  If there is
217e89516f0SMike Frysinger    not enough available input to do that, then return from inflate(). */
218e89516f0SMike Frysinger #define NEEDBITS(n) \
219e89516f0SMike Frysinger     do { \
220e89516f0SMike Frysinger         while (bits < (unsigned)(n)) \
221e89516f0SMike Frysinger             PULLBYTE(); \
222e89516f0SMike Frysinger     } while (0)
223e89516f0SMike Frysinger 
224e89516f0SMike Frysinger /* Return the low n bits of the bit accumulator (n < 16) */
225e89516f0SMike Frysinger #define BITS(n) \
226e89516f0SMike Frysinger     ((unsigned)hold & ((1U << (n)) - 1))
227e89516f0SMike Frysinger 
228e89516f0SMike Frysinger /* Remove n bits from the bit accumulator */
229e89516f0SMike Frysinger #define DROPBITS(n) \
230e89516f0SMike Frysinger     do { \
231e89516f0SMike Frysinger         hold >>= (n); \
232e89516f0SMike Frysinger         bits -= (unsigned)(n); \
233e89516f0SMike Frysinger     } while (0)
234e89516f0SMike Frysinger 
235e89516f0SMike Frysinger /* Remove zero to seven bits as needed to go to a byte boundary */
236e89516f0SMike Frysinger #define BYTEBITS() \
237e89516f0SMike Frysinger     do { \
238e89516f0SMike Frysinger         hold >>= bits & 7; \
239e89516f0SMike Frysinger         bits -= bits & 7; \
240e89516f0SMike Frysinger     } while (0)
241e89516f0SMike Frysinger 
242e89516f0SMike Frysinger /* Reverse the bytes in a 32-bit value */
243e89516f0SMike Frysinger #define REVERSE(q) \
244e89516f0SMike Frysinger     ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
245e89516f0SMike Frysinger      (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
246e89516f0SMike Frysinger 
247e89516f0SMike Frysinger /*
248e89516f0SMike Frysinger    inflate() uses a state machine to process as much input data and generate as
249e89516f0SMike Frysinger    much output data as possible before returning.  The state machine is
250e89516f0SMike Frysinger    structured roughly as follows:
251e89516f0SMike Frysinger 
252e89516f0SMike Frysinger     for (;;) switch (state) {
253e89516f0SMike Frysinger     ...
254e89516f0SMike Frysinger     case STATEn:
255e89516f0SMike Frysinger         if (not enough input data or output space to make progress)
256e89516f0SMike Frysinger             return;
257e89516f0SMike Frysinger         ... make progress ...
258e89516f0SMike Frysinger         state = STATEm;
259e89516f0SMike Frysinger         break;
260e89516f0SMike Frysinger     ...
261e89516f0SMike Frysinger     }
262e89516f0SMike Frysinger 
263e89516f0SMike Frysinger    so when inflate() is called again, the same case is attempted again, and
264e89516f0SMike Frysinger    if the appropriate resources are provided, the machine proceeds to the
265e89516f0SMike Frysinger    next state.  The NEEDBITS() macro is usually the way the state evaluates
266e89516f0SMike Frysinger    whether it can proceed or should return.  NEEDBITS() does the return if
267e89516f0SMike Frysinger    the requested bits are not available.  The typical use of the BITS macros
268e89516f0SMike Frysinger    is:
269e89516f0SMike Frysinger 
270e89516f0SMike Frysinger         NEEDBITS(n);
271e89516f0SMike Frysinger         ... do something with BITS(n) ...
272e89516f0SMike Frysinger         DROPBITS(n);
273e89516f0SMike Frysinger 
274e89516f0SMike Frysinger    where NEEDBITS(n) either returns from inflate() if there isn't enough
275e89516f0SMike Frysinger    input left to load n bits into the accumulator, or it continues.  BITS(n)
276e89516f0SMike Frysinger    gives the low n bits in the accumulator.  When done, DROPBITS(n) drops
277e89516f0SMike Frysinger    the low n bits off the accumulator.  INITBITS() clears the accumulator
278e89516f0SMike Frysinger    and sets the number of available bits to zero.  BYTEBITS() discards just
279e89516f0SMike Frysinger    enough bits to put the accumulator on a byte boundary.  After BYTEBITS()
280e89516f0SMike Frysinger    and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
281e89516f0SMike Frysinger 
282e89516f0SMike Frysinger    NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
283e89516f0SMike Frysinger    if there is no input available.  The decoding of variable length codes uses
284e89516f0SMike Frysinger    PULLBYTE() directly in order to pull just enough bytes to decode the next
285e89516f0SMike Frysinger    code, and no more.
286e89516f0SMike Frysinger 
287e89516f0SMike Frysinger    Some states loop until they get enough input, making sure that enough
288e89516f0SMike Frysinger    state information is maintained to continue the loop where it left off
289e89516f0SMike Frysinger    if NEEDBITS() returns in the loop.  For example, want, need, and keep
290e89516f0SMike Frysinger    would all have to actually be part of the saved state in case NEEDBITS()
291e89516f0SMike Frysinger    returns:
292e89516f0SMike Frysinger 
293e89516f0SMike Frysinger     case STATEw:
294e89516f0SMike Frysinger         while (want < need) {
295e89516f0SMike Frysinger             NEEDBITS(n);
296e89516f0SMike Frysinger             keep[want++] = BITS(n);
297e89516f0SMike Frysinger             DROPBITS(n);
298e89516f0SMike Frysinger         }
299e89516f0SMike Frysinger         state = STATEx;
300e89516f0SMike Frysinger     case STATEx:
301e89516f0SMike Frysinger 
302e89516f0SMike Frysinger    As shown above, if the next state is also the next case, then the break
303e89516f0SMike Frysinger    is omitted.
304e89516f0SMike Frysinger 
305e89516f0SMike Frysinger    A state may also return if there is not enough output space available to
306e89516f0SMike Frysinger    complete that state.  Those states are copying stored data, writing a
307e89516f0SMike Frysinger    literal byte, and copying a matching string.
308e89516f0SMike Frysinger 
309e89516f0SMike Frysinger    When returning, a "goto inf_leave" is used to update the total counters,
310e89516f0SMike Frysinger    update the check value, and determine whether any progress has been made
311e89516f0SMike Frysinger    during that inflate() call in order to return the proper return code.
312e89516f0SMike Frysinger    Progress is defined as a change in either strm->avail_in or strm->avail_out.
313e89516f0SMike Frysinger    When there is a window, goto inf_leave will update the window with the last
314e89516f0SMike Frysinger    output written.  If a goto inf_leave occurs in the middle of decompression
315e89516f0SMike Frysinger    and there is no window currently, goto inf_leave will create one and copy
316e89516f0SMike Frysinger    output to the window for the next call of inflate().
317e89516f0SMike Frysinger 
318e89516f0SMike Frysinger    In this implementation, the flush parameter of inflate() only affects the
319e89516f0SMike Frysinger    return code (per zlib.h).  inflate() always writes as much as possible to
320e89516f0SMike Frysinger    strm->next_out, given the space available and the provided input--the effect
321e89516f0SMike Frysinger    documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers
322e89516f0SMike Frysinger    the allocation of and copying into a sliding window until necessary, which
323e89516f0SMike Frysinger    provides the effect documented in zlib.h for Z_FINISH when the entire input
324e89516f0SMike Frysinger    stream available.  So the only thing the flush parameter actually does is:
325e89516f0SMike Frysinger    when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it
326e89516f0SMike Frysinger    will return Z_BUF_ERROR if it has not reached the end of the stream.
327e89516f0SMike Frysinger  */
inflate(z_streamp strm,int flush)328*ee820b5eSKim Phillips int ZEXPORT inflate(z_streamp strm, int flush)
329e89516f0SMike Frysinger {
330e89516f0SMike Frysinger     struct inflate_state FAR *state;
331e89516f0SMike Frysinger     unsigned char FAR *next;    /* next input */
332e89516f0SMike Frysinger     unsigned char FAR *put;     /* next output */
333e89516f0SMike Frysinger     unsigned have, left;        /* available input and output */
334e89516f0SMike Frysinger     unsigned long hold;         /* bit buffer */
335e89516f0SMike Frysinger     unsigned bits;              /* bits in bit buffer */
336e89516f0SMike Frysinger     unsigned in, out;           /* save starting available input and output */
337e89516f0SMike Frysinger     unsigned copy;              /* number of stored or match bytes to copy */
338e89516f0SMike Frysinger     unsigned char FAR *from;    /* where to copy match bytes from */
339e89516f0SMike Frysinger     code this;                  /* current decoding table entry */
340e89516f0SMike Frysinger     code last;                  /* parent table entry */
341e89516f0SMike Frysinger     unsigned len;               /* length to copy for repeats, bits to drop */
342e89516f0SMike Frysinger     int ret;                    /* return code */
343e89516f0SMike Frysinger #ifdef GUNZIP
344e89516f0SMike Frysinger     unsigned char hbuf[4];      /* buffer for gzip header crc calculation */
345e89516f0SMike Frysinger #endif
346e89516f0SMike Frysinger     static const unsigned short order[19] = /* permutation of code lengths */
347e89516f0SMike Frysinger         {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
348e89516f0SMike Frysinger 
349e89516f0SMike Frysinger     if (strm == Z_NULL || strm->state == Z_NULL ||
350e89516f0SMike Frysinger         (strm->next_in == Z_NULL && strm->avail_in != 0))
351e89516f0SMike Frysinger         return Z_STREAM_ERROR;
352e89516f0SMike Frysinger 
353e89516f0SMike Frysinger     state = (struct inflate_state FAR *)strm->state;
354e89516f0SMike Frysinger     if (state->mode == TYPE) state->mode = TYPEDO;      /* skip check */
355e89516f0SMike Frysinger     LOAD();
356e89516f0SMike Frysinger     in = have;
357e89516f0SMike Frysinger     out = left;
358e89516f0SMike Frysinger     ret = Z_OK;
359e89516f0SMike Frysinger     for (;;)
360e89516f0SMike Frysinger         switch (state->mode) {
361e89516f0SMike Frysinger         case HEAD:
362e89516f0SMike Frysinger             if (state->wrap == 0) {
363e89516f0SMike Frysinger                 state->mode = TYPEDO;
364e89516f0SMike Frysinger                 break;
365e89516f0SMike Frysinger             }
366e89516f0SMike Frysinger             NEEDBITS(16);
367e89516f0SMike Frysinger #ifdef GUNZIP
368e89516f0SMike Frysinger             if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */
369e89516f0SMike Frysinger                 state->check = crc32(0L, Z_NULL, 0);
370e89516f0SMike Frysinger                 CRC2(state->check, hold);
371e89516f0SMike Frysinger                 INITBITS();
372e89516f0SMike Frysinger                 state->mode = FLAGS;
373e89516f0SMike Frysinger                 break;
374e89516f0SMike Frysinger             }
375e89516f0SMike Frysinger             state->flags = 0;           /* expect zlib header */
376e89516f0SMike Frysinger             if (state->head != Z_NULL)
377e89516f0SMike Frysinger                 state->head->done = -1;
378e89516f0SMike Frysinger             if (!(state->wrap & 1) ||   /* check if zlib header allowed */
379e89516f0SMike Frysinger #else
380e89516f0SMike Frysinger             if (
381e89516f0SMike Frysinger #endif
382e89516f0SMike Frysinger                 ((BITS(8) << 8) + (hold >> 8)) % 31) {
383e89516f0SMike Frysinger                 strm->msg = (char *)"incorrect header check";
384e89516f0SMike Frysinger                 state->mode = BAD;
385e89516f0SMike Frysinger                 break;
386e89516f0SMike Frysinger             }
387e89516f0SMike Frysinger             if (BITS(4) != Z_DEFLATED) {
388e89516f0SMike Frysinger                 strm->msg = (char *)"unknown compression method";
389e89516f0SMike Frysinger                 state->mode = BAD;
390e89516f0SMike Frysinger                 break;
391e89516f0SMike Frysinger             }
392e89516f0SMike Frysinger             DROPBITS(4);
393e89516f0SMike Frysinger             len = BITS(4) + 8;
394e89516f0SMike Frysinger             if (len > state->wbits) {
395e89516f0SMike Frysinger                 strm->msg = (char *)"invalid window size";
396e89516f0SMike Frysinger                 state->mode = BAD;
397e89516f0SMike Frysinger                 break;
398e89516f0SMike Frysinger             }
399e89516f0SMike Frysinger             state->dmax = 1U << len;
400e89516f0SMike Frysinger             Tracev((stderr, "inflate:   zlib header ok\n"));
401e89516f0SMike Frysinger             strm->adler = state->check = adler32(0L, Z_NULL, 0);
402e89516f0SMike Frysinger             state->mode = hold & 0x200 ? DICTID : TYPE;
403e89516f0SMike Frysinger             INITBITS();
404e89516f0SMike Frysinger             break;
405e89516f0SMike Frysinger #ifdef GUNZIP
406e89516f0SMike Frysinger         case FLAGS:
407e89516f0SMike Frysinger             NEEDBITS(16);
408e89516f0SMike Frysinger             state->flags = (int)(hold);
409e89516f0SMike Frysinger             if ((state->flags & 0xff) != Z_DEFLATED) {
410e89516f0SMike Frysinger                 strm->msg = (char *)"unknown compression method";
411e89516f0SMike Frysinger                 state->mode = BAD;
412e89516f0SMike Frysinger                 break;
413e89516f0SMike Frysinger             }
414e89516f0SMike Frysinger             if (state->flags & 0xe000) {
415e89516f0SMike Frysinger                 strm->msg = (char *)"unknown header flags set";
416e89516f0SMike Frysinger                 state->mode = BAD;
417e89516f0SMike Frysinger                 break;
418e89516f0SMike Frysinger             }
419e89516f0SMike Frysinger             if (state->head != Z_NULL)
420e89516f0SMike Frysinger                 state->head->text = (int)((hold >> 8) & 1);
421e89516f0SMike Frysinger             if (state->flags & 0x0200) CRC2(state->check, hold);
422e89516f0SMike Frysinger             INITBITS();
423e89516f0SMike Frysinger             state->mode = TIME;
424e89516f0SMike Frysinger         case TIME:
425e89516f0SMike Frysinger             NEEDBITS(32);
426e89516f0SMike Frysinger             if (state->head != Z_NULL)
427e89516f0SMike Frysinger                 state->head->time = hold;
428e89516f0SMike Frysinger             if (state->flags & 0x0200) CRC4(state->check, hold);
429e89516f0SMike Frysinger             INITBITS();
430e89516f0SMike Frysinger             state->mode = OS;
431e89516f0SMike Frysinger         case OS:
432e89516f0SMike Frysinger             NEEDBITS(16);
433e89516f0SMike Frysinger             if (state->head != Z_NULL) {
434e89516f0SMike Frysinger                 state->head->xflags = (int)(hold & 0xff);
435e89516f0SMike Frysinger                 state->head->os = (int)(hold >> 8);
436e89516f0SMike Frysinger             }
437e89516f0SMike Frysinger             if (state->flags & 0x0200) CRC2(state->check, hold);
438e89516f0SMike Frysinger             INITBITS();
439e89516f0SMike Frysinger             state->mode = EXLEN;
440e89516f0SMike Frysinger         case EXLEN:
441e89516f0SMike Frysinger             if (state->flags & 0x0400) {
442e89516f0SMike Frysinger                 NEEDBITS(16);
443e89516f0SMike Frysinger                 state->length = (unsigned)(hold);
444e89516f0SMike Frysinger                 if (state->head != Z_NULL)
445e89516f0SMike Frysinger                     state->head->extra_len = (unsigned)hold;
446e89516f0SMike Frysinger                 if (state->flags & 0x0200) CRC2(state->check, hold);
447e89516f0SMike Frysinger                 INITBITS();
448e89516f0SMike Frysinger             }
449e89516f0SMike Frysinger             else if (state->head != Z_NULL)
450e89516f0SMike Frysinger                 state->head->extra = Z_NULL;
451e89516f0SMike Frysinger             state->mode = EXTRA;
452e89516f0SMike Frysinger         case EXTRA:
453e89516f0SMike Frysinger             if (state->flags & 0x0400) {
454e89516f0SMike Frysinger                 copy = state->length;
455e89516f0SMike Frysinger                 if (copy > have) copy = have;
456e89516f0SMike Frysinger                 if (copy) {
457e89516f0SMike Frysinger                     if (state->head != Z_NULL &&
458e89516f0SMike Frysinger                         state->head->extra != Z_NULL) {
459e89516f0SMike Frysinger                         len = state->head->extra_len - state->length;
460e89516f0SMike Frysinger                         zmemcpy(state->head->extra + len, next,
461e89516f0SMike Frysinger                                 len + copy > state->head->extra_max ?
462e89516f0SMike Frysinger                                 state->head->extra_max - len : copy);
463e89516f0SMike Frysinger                     }
464e89516f0SMike Frysinger                     if (state->flags & 0x0200)
465e89516f0SMike Frysinger                         state->check = crc32(state->check, next, copy);
466e89516f0SMike Frysinger                     have -= copy;
467e89516f0SMike Frysinger                     next += copy;
468e89516f0SMike Frysinger                     state->length -= copy;
469e89516f0SMike Frysinger                 }
470e89516f0SMike Frysinger                 if (state->length) goto inf_leave;
471e89516f0SMike Frysinger             }
472e89516f0SMike Frysinger             state->length = 0;
473e89516f0SMike Frysinger             state->mode = NAME;
474e89516f0SMike Frysinger         case NAME:
475e89516f0SMike Frysinger             if (state->flags & 0x0800) {
476e89516f0SMike Frysinger                 if (have == 0) goto inf_leave;
477e89516f0SMike Frysinger                 copy = 0;
478e89516f0SMike Frysinger                 do {
479e89516f0SMike Frysinger                     len = (unsigned)(next[copy++]);
480e89516f0SMike Frysinger                     if (state->head != Z_NULL &&
481e89516f0SMike Frysinger                             state->head->name != Z_NULL &&
482e89516f0SMike Frysinger                             state->length < state->head->name_max)
483e89516f0SMike Frysinger                         state->head->name[state->length++] = len;
484e89516f0SMike Frysinger                 } while (len && copy < have);
485e89516f0SMike Frysinger                 if (state->flags & 0x0200)
486e89516f0SMike Frysinger                     state->check = crc32(state->check, next, copy);
487e89516f0SMike Frysinger                 have -= copy;
488e89516f0SMike Frysinger                 next += copy;
489e89516f0SMike Frysinger                 if (len) goto inf_leave;
490e89516f0SMike Frysinger             }
491e89516f0SMike Frysinger             else if (state->head != Z_NULL)
492e89516f0SMike Frysinger                 state->head->name = Z_NULL;
493e89516f0SMike Frysinger             state->length = 0;
494e89516f0SMike Frysinger             state->mode = COMMENT;
495e89516f0SMike Frysinger         case COMMENT:
496e89516f0SMike Frysinger             if (state->flags & 0x1000) {
497e89516f0SMike Frysinger                 if (have == 0) goto inf_leave;
498e89516f0SMike Frysinger                 copy = 0;
499e89516f0SMike Frysinger                 do {
500e89516f0SMike Frysinger                     len = (unsigned)(next[copy++]);
501e89516f0SMike Frysinger                     if (state->head != Z_NULL &&
502e89516f0SMike Frysinger                             state->head->comment != Z_NULL &&
503e89516f0SMike Frysinger                             state->length < state->head->comm_max)
504e89516f0SMike Frysinger                         state->head->comment[state->length++] = len;
505e89516f0SMike Frysinger                 } while (len && copy < have);
506e89516f0SMike Frysinger                 if (state->flags & 0x0200)
507e89516f0SMike Frysinger                     state->check = crc32(state->check, next, copy);
508e89516f0SMike Frysinger                 have -= copy;
509e89516f0SMike Frysinger                 next += copy;
510e89516f0SMike Frysinger                 if (len) goto inf_leave;
511e89516f0SMike Frysinger             }
512e89516f0SMike Frysinger             else if (state->head != Z_NULL)
513e89516f0SMike Frysinger                 state->head->comment = Z_NULL;
514e89516f0SMike Frysinger             state->mode = HCRC;
515e89516f0SMike Frysinger         case HCRC:
516e89516f0SMike Frysinger             if (state->flags & 0x0200) {
517e89516f0SMike Frysinger                 NEEDBITS(16);
518e89516f0SMike Frysinger                 if (hold != (state->check & 0xffff)) {
519e89516f0SMike Frysinger                     strm->msg = (char *)"header crc mismatch";
520e89516f0SMike Frysinger                     state->mode = BAD;
521e89516f0SMike Frysinger                     break;
522e89516f0SMike Frysinger                 }
523e89516f0SMike Frysinger                 INITBITS();
524e89516f0SMike Frysinger             }
525e89516f0SMike Frysinger             if (state->head != Z_NULL) {
526e89516f0SMike Frysinger                 state->head->hcrc = (int)((state->flags >> 9) & 1);
527e89516f0SMike Frysinger                 state->head->done = 1;
528e89516f0SMike Frysinger             }
529e89516f0SMike Frysinger             strm->adler = state->check = crc32(0L, Z_NULL, 0);
530e89516f0SMike Frysinger             state->mode = TYPE;
531e89516f0SMike Frysinger             break;
532e89516f0SMike Frysinger #endif
533e89516f0SMike Frysinger         case DICTID:
534e89516f0SMike Frysinger             NEEDBITS(32);
535e89516f0SMike Frysinger             strm->adler = state->check = REVERSE(hold);
536e89516f0SMike Frysinger             INITBITS();
537e89516f0SMike Frysinger             state->mode = DICT;
538e89516f0SMike Frysinger         case DICT:
539e89516f0SMike Frysinger             if (state->havedict == 0) {
540e89516f0SMike Frysinger                 RESTORE();
541e89516f0SMike Frysinger                 return Z_NEED_DICT;
542e89516f0SMike Frysinger             }
543e89516f0SMike Frysinger             strm->adler = state->check = adler32(0L, Z_NULL, 0);
544e89516f0SMike Frysinger             state->mode = TYPE;
545e89516f0SMike Frysinger         case TYPE:
546e89516f0SMike Frysinger 	    WATCHDOG_RESET();
547e89516f0SMike Frysinger             if (flush == Z_BLOCK) goto inf_leave;
548e89516f0SMike Frysinger         case TYPEDO:
549e89516f0SMike Frysinger             if (state->last) {
550e89516f0SMike Frysinger                 BYTEBITS();
551e89516f0SMike Frysinger                 state->mode = CHECK;
552e89516f0SMike Frysinger                 break;
553e89516f0SMike Frysinger             }
554e89516f0SMike Frysinger             NEEDBITS(3);
555e89516f0SMike Frysinger             state->last = BITS(1);
556e89516f0SMike Frysinger             DROPBITS(1);
557e89516f0SMike Frysinger             switch (BITS(2)) {
558e89516f0SMike Frysinger             case 0:                             /* stored block */
559e89516f0SMike Frysinger                 Tracev((stderr, "inflate:     stored block%s\n",
560e89516f0SMike Frysinger                         state->last ? " (last)" : ""));
561e89516f0SMike Frysinger                 state->mode = STORED;
562e89516f0SMike Frysinger                 break;
563e89516f0SMike Frysinger             case 1:                             /* fixed block */
564e89516f0SMike Frysinger                 fixedtables(state);
565e89516f0SMike Frysinger                 Tracev((stderr, "inflate:     fixed codes block%s\n",
566e89516f0SMike Frysinger                         state->last ? " (last)" : ""));
567e89516f0SMike Frysinger                 state->mode = LEN;              /* decode codes */
568e89516f0SMike Frysinger                 break;
569e89516f0SMike Frysinger             case 2:                             /* dynamic block */
570e89516f0SMike Frysinger                 Tracev((stderr, "inflate:     dynamic codes block%s\n",
571e89516f0SMike Frysinger                         state->last ? " (last)" : ""));
572e89516f0SMike Frysinger                 state->mode = TABLE;
573e89516f0SMike Frysinger                 break;
574e89516f0SMike Frysinger             case 3:
575e89516f0SMike Frysinger                 strm->msg = (char *)"invalid block type";
576e89516f0SMike Frysinger                 state->mode = BAD;
577e89516f0SMike Frysinger             }
578e89516f0SMike Frysinger             DROPBITS(2);
579e89516f0SMike Frysinger             break;
580e89516f0SMike Frysinger         case STORED:
581e89516f0SMike Frysinger             BYTEBITS();                         /* go to byte boundary */
582e89516f0SMike Frysinger             NEEDBITS(32);
583e89516f0SMike Frysinger             if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
584e89516f0SMike Frysinger                 strm->msg = (char *)"invalid stored block lengths";
585e89516f0SMike Frysinger                 state->mode = BAD;
586e89516f0SMike Frysinger                 break;
587e89516f0SMike Frysinger             }
588e89516f0SMike Frysinger             state->length = (unsigned)hold & 0xffff;
589e89516f0SMike Frysinger             Tracev((stderr, "inflate:       stored length %u\n",
590e89516f0SMike Frysinger                     state->length));
591e89516f0SMike Frysinger             INITBITS();
592e89516f0SMike Frysinger             state->mode = COPY;
593e89516f0SMike Frysinger         case COPY:
594e89516f0SMike Frysinger             copy = state->length;
595e89516f0SMike Frysinger             if (copy) {
596e89516f0SMike Frysinger                 if (copy > have) copy = have;
597e89516f0SMike Frysinger                 if (copy > left) copy = left;
598e89516f0SMike Frysinger                 if (copy == 0) goto inf_leave;
599e89516f0SMike Frysinger                 zmemcpy(put, next, copy);
600e89516f0SMike Frysinger                 have -= copy;
601e89516f0SMike Frysinger                 next += copy;
602e89516f0SMike Frysinger                 left -= copy;
603e89516f0SMike Frysinger                 put += copy;
604e89516f0SMike Frysinger                 state->length -= copy;
605e89516f0SMike Frysinger                 break;
606e89516f0SMike Frysinger             }
607e89516f0SMike Frysinger             Tracev((stderr, "inflate:       stored end\n"));
608e89516f0SMike Frysinger             state->mode = TYPE;
609e89516f0SMike Frysinger             break;
610e89516f0SMike Frysinger         case TABLE:
611e89516f0SMike Frysinger             NEEDBITS(14);
612e89516f0SMike Frysinger             state->nlen = BITS(5) + 257;
613e89516f0SMike Frysinger             DROPBITS(5);
614e89516f0SMike Frysinger             state->ndist = BITS(5) + 1;
615e89516f0SMike Frysinger             DROPBITS(5);
616e89516f0SMike Frysinger             state->ncode = BITS(4) + 4;
617e89516f0SMike Frysinger             DROPBITS(4);
618e89516f0SMike Frysinger #ifndef PKZIP_BUG_WORKAROUND
619e89516f0SMike Frysinger             if (state->nlen > 286 || state->ndist > 30) {
620e89516f0SMike Frysinger                 strm->msg = (char *)"too many length or distance symbols";
621e89516f0SMike Frysinger                 state->mode = BAD;
622e89516f0SMike Frysinger                 break;
623e89516f0SMike Frysinger             }
624e89516f0SMike Frysinger #endif
625e89516f0SMike Frysinger             Tracev((stderr, "inflate:       table sizes ok\n"));
626e89516f0SMike Frysinger             state->have = 0;
627e89516f0SMike Frysinger             state->mode = LENLENS;
628e89516f0SMike Frysinger         case LENLENS:
629e89516f0SMike Frysinger             while (state->have < state->ncode) {
630e89516f0SMike Frysinger                 NEEDBITS(3);
631e89516f0SMike Frysinger                 state->lens[order[state->have++]] = (unsigned short)BITS(3);
632e89516f0SMike Frysinger                 DROPBITS(3);
633e89516f0SMike Frysinger             }
634e89516f0SMike Frysinger             while (state->have < 19)
635e89516f0SMike Frysinger                 state->lens[order[state->have++]] = 0;
636e89516f0SMike Frysinger             state->next = state->codes;
637e89516f0SMike Frysinger             state->lencode = (code const FAR *)(state->next);
638e89516f0SMike Frysinger             state->lenbits = 7;
639e89516f0SMike Frysinger             ret = inflate_table(CODES, state->lens, 19, &(state->next),
640e89516f0SMike Frysinger                                 &(state->lenbits), state->work);
641e89516f0SMike Frysinger             if (ret) {
642e89516f0SMike Frysinger                 strm->msg = (char *)"invalid code lengths set";
643e89516f0SMike Frysinger                 state->mode = BAD;
644e89516f0SMike Frysinger                 break;
645e89516f0SMike Frysinger             }
646e89516f0SMike Frysinger             Tracev((stderr, "inflate:       code lengths ok\n"));
647e89516f0SMike Frysinger             state->have = 0;
648e89516f0SMike Frysinger             state->mode = CODELENS;
649e89516f0SMike Frysinger         case CODELENS:
650e89516f0SMike Frysinger             while (state->have < state->nlen + state->ndist) {
651e89516f0SMike Frysinger                 for (;;) {
652e89516f0SMike Frysinger                     this = state->lencode[BITS(state->lenbits)];
653e89516f0SMike Frysinger                     if ((unsigned)(this.bits) <= bits) break;
654e89516f0SMike Frysinger                     PULLBYTE();
655e89516f0SMike Frysinger                 }
656e89516f0SMike Frysinger                 if (this.val < 16) {
657e89516f0SMike Frysinger                     NEEDBITS(this.bits);
658e89516f0SMike Frysinger                     DROPBITS(this.bits);
659e89516f0SMike Frysinger                     state->lens[state->have++] = this.val;
660e89516f0SMike Frysinger                 }
661e89516f0SMike Frysinger                 else {
662e89516f0SMike Frysinger                     if (this.val == 16) {
663e89516f0SMike Frysinger                         NEEDBITS(this.bits + 2);
664e89516f0SMike Frysinger                         DROPBITS(this.bits);
665e89516f0SMike Frysinger                         if (state->have == 0) {
666e89516f0SMike Frysinger                             strm->msg = (char *)"invalid bit length repeat";
667e89516f0SMike Frysinger                             state->mode = BAD;
668e89516f0SMike Frysinger                             break;
669e89516f0SMike Frysinger                         }
670e89516f0SMike Frysinger                         len = state->lens[state->have - 1];
671e89516f0SMike Frysinger                         copy = 3 + BITS(2);
672e89516f0SMike Frysinger                         DROPBITS(2);
673e89516f0SMike Frysinger                     }
674e89516f0SMike Frysinger                     else if (this.val == 17) {
675e89516f0SMike Frysinger                         NEEDBITS(this.bits + 3);
676e89516f0SMike Frysinger                         DROPBITS(this.bits);
677e89516f0SMike Frysinger                         len = 0;
678e89516f0SMike Frysinger                         copy = 3 + BITS(3);
679e89516f0SMike Frysinger                         DROPBITS(3);
680e89516f0SMike Frysinger                     }
681e89516f0SMike Frysinger                     else {
682e89516f0SMike Frysinger                         NEEDBITS(this.bits + 7);
683e89516f0SMike Frysinger                         DROPBITS(this.bits);
684e89516f0SMike Frysinger                         len = 0;
685e89516f0SMike Frysinger                         copy = 11 + BITS(7);
686e89516f0SMike Frysinger                         DROPBITS(7);
687e89516f0SMike Frysinger                     }
688e89516f0SMike Frysinger                     if (state->have + copy > state->nlen + state->ndist) {
689e89516f0SMike Frysinger                         strm->msg = (char *)"invalid bit length repeat";
690e89516f0SMike Frysinger                         state->mode = BAD;
691e89516f0SMike Frysinger                         break;
692e89516f0SMike Frysinger                     }
693e89516f0SMike Frysinger                     while (copy--)
694e89516f0SMike Frysinger                         state->lens[state->have++] = (unsigned short)len;
695e89516f0SMike Frysinger                 }
696e89516f0SMike Frysinger             }
697e89516f0SMike Frysinger 
698e89516f0SMike Frysinger             /* handle error breaks in while */
699e89516f0SMike Frysinger             if (state->mode == BAD) break;
700e89516f0SMike Frysinger 
701e89516f0SMike Frysinger             /* build code tables */
702e89516f0SMike Frysinger             state->next = state->codes;
703e89516f0SMike Frysinger             state->lencode = (code const FAR *)(state->next);
704e89516f0SMike Frysinger             state->lenbits = 9;
705e89516f0SMike Frysinger             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
706e89516f0SMike Frysinger                                 &(state->lenbits), state->work);
707e89516f0SMike Frysinger             if (ret) {
708e89516f0SMike Frysinger                 strm->msg = (char *)"invalid literal/lengths set";
709e89516f0SMike Frysinger                 state->mode = BAD;
710e89516f0SMike Frysinger                 break;
711e89516f0SMike Frysinger             }
712e89516f0SMike Frysinger             state->distcode = (code const FAR *)(state->next);
713e89516f0SMike Frysinger             state->distbits = 6;
714e89516f0SMike Frysinger             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
715e89516f0SMike Frysinger                             &(state->next), &(state->distbits), state->work);
716e89516f0SMike Frysinger             if (ret) {
717e89516f0SMike Frysinger                 strm->msg = (char *)"invalid distances set";
718e89516f0SMike Frysinger                 state->mode = BAD;
719e89516f0SMike Frysinger                 break;
720e89516f0SMike Frysinger             }
721e89516f0SMike Frysinger             Tracev((stderr, "inflate:       codes ok\n"));
722e89516f0SMike Frysinger             state->mode = LEN;
723e89516f0SMike Frysinger         case LEN:
724e89516f0SMike Frysinger 	    WATCHDOG_RESET();
725e89516f0SMike Frysinger             if (have >= 6 && left >= 258) {
726e89516f0SMike Frysinger                 RESTORE();
727e89516f0SMike Frysinger                 inflate_fast(strm, out);
728e89516f0SMike Frysinger                 LOAD();
729e89516f0SMike Frysinger                 break;
730e89516f0SMike Frysinger             }
731e89516f0SMike Frysinger             for (;;) {
732e89516f0SMike Frysinger                 this = state->lencode[BITS(state->lenbits)];
733e89516f0SMike Frysinger                 if ((unsigned)(this.bits) <= bits) break;
734e89516f0SMike Frysinger                 PULLBYTE();
735e89516f0SMike Frysinger             }
736e89516f0SMike Frysinger             if (this.op && (this.op & 0xf0) == 0) {
737e89516f0SMike Frysinger                 last = this;
738e89516f0SMike Frysinger                 for (;;) {
739e89516f0SMike Frysinger                     this = state->lencode[last.val +
740e89516f0SMike Frysinger                             (BITS(last.bits + last.op) >> last.bits)];
741e89516f0SMike Frysinger                     if ((unsigned)(last.bits + this.bits) <= bits) break;
742e89516f0SMike Frysinger                     PULLBYTE();
743e89516f0SMike Frysinger                 }
744e89516f0SMike Frysinger                 DROPBITS(last.bits);
745e89516f0SMike Frysinger             }
746e89516f0SMike Frysinger             DROPBITS(this.bits);
747e89516f0SMike Frysinger             state->length = (unsigned)this.val;
748e89516f0SMike Frysinger             if ((int)(this.op) == 0) {
749e89516f0SMike Frysinger                 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
750e89516f0SMike Frysinger                         "inflate:         literal '%c'\n" :
751e89516f0SMike Frysinger                         "inflate:         literal 0x%02x\n", this.val));
752e89516f0SMike Frysinger                 state->mode = LIT;
753e89516f0SMike Frysinger                 break;
754e89516f0SMike Frysinger             }
755e89516f0SMike Frysinger             if (this.op & 32) {
756e89516f0SMike Frysinger                 Tracevv((stderr, "inflate:         end of block\n"));
757e89516f0SMike Frysinger                 state->mode = TYPE;
758e89516f0SMike Frysinger                 break;
759e89516f0SMike Frysinger             }
760e89516f0SMike Frysinger             if (this.op & 64) {
761e89516f0SMike Frysinger                 strm->msg = (char *)"invalid literal/length code";
762e89516f0SMike Frysinger                 state->mode = BAD;
763e89516f0SMike Frysinger                 break;
764e89516f0SMike Frysinger             }
765e89516f0SMike Frysinger             state->extra = (unsigned)(this.op) & 15;
766e89516f0SMike Frysinger             state->mode = LENEXT;
767e89516f0SMike Frysinger         case LENEXT:
768e89516f0SMike Frysinger             if (state->extra) {
769e89516f0SMike Frysinger                 NEEDBITS(state->extra);
770e89516f0SMike Frysinger                 state->length += BITS(state->extra);
771e89516f0SMike Frysinger                 DROPBITS(state->extra);
772e89516f0SMike Frysinger             }
773e89516f0SMike Frysinger             Tracevv((stderr, "inflate:         length %u\n", state->length));
774e89516f0SMike Frysinger             state->mode = DIST;
775e89516f0SMike Frysinger         case DIST:
776e89516f0SMike Frysinger             for (;;) {
777e89516f0SMike Frysinger                 this = state->distcode[BITS(state->distbits)];
778e89516f0SMike Frysinger                 if ((unsigned)(this.bits) <= bits) break;
779e89516f0SMike Frysinger                 PULLBYTE();
780e89516f0SMike Frysinger             }
781e89516f0SMike Frysinger             if ((this.op & 0xf0) == 0) {
782e89516f0SMike Frysinger                 last = this;
783e89516f0SMike Frysinger                 for (;;) {
784e89516f0SMike Frysinger                     this = state->distcode[last.val +
785e89516f0SMike Frysinger                             (BITS(last.bits + last.op) >> last.bits)];
786e89516f0SMike Frysinger                     if ((unsigned)(last.bits + this.bits) <= bits) break;
787e89516f0SMike Frysinger                     PULLBYTE();
788e89516f0SMike Frysinger                 }
789e89516f0SMike Frysinger                 DROPBITS(last.bits);
790e89516f0SMike Frysinger             }
791e89516f0SMike Frysinger             DROPBITS(this.bits);
792e89516f0SMike Frysinger             if (this.op & 64) {
793e89516f0SMike Frysinger                 strm->msg = (char *)"invalid distance code";
794e89516f0SMike Frysinger                 state->mode = BAD;
795e89516f0SMike Frysinger                 break;
796e89516f0SMike Frysinger             }
797e89516f0SMike Frysinger             state->offset = (unsigned)this.val;
798e89516f0SMike Frysinger             state->extra = (unsigned)(this.op) & 15;
799e89516f0SMike Frysinger             state->mode = DISTEXT;
800e89516f0SMike Frysinger         case DISTEXT:
801e89516f0SMike Frysinger             if (state->extra) {
802e89516f0SMike Frysinger                 NEEDBITS(state->extra);
803e89516f0SMike Frysinger                 state->offset += BITS(state->extra);
804e89516f0SMike Frysinger                 DROPBITS(state->extra);
805e89516f0SMike Frysinger             }
806e89516f0SMike Frysinger #ifdef INFLATE_STRICT
807e89516f0SMike Frysinger             if (state->offset > state->dmax) {
808e89516f0SMike Frysinger                 strm->msg = (char *)"invalid distance too far back";
809e89516f0SMike Frysinger                 state->mode = BAD;
810e89516f0SMike Frysinger                 break;
811e89516f0SMike Frysinger             }
812e89516f0SMike Frysinger #endif
813e89516f0SMike Frysinger             if (state->offset > state->whave + out - left) {
814e89516f0SMike Frysinger                 strm->msg = (char *)"invalid distance too far back";
815e89516f0SMike Frysinger                 state->mode = BAD;
816e89516f0SMike Frysinger                 break;
817e89516f0SMike Frysinger             }
818e89516f0SMike Frysinger             Tracevv((stderr, "inflate:         distance %u\n", state->offset));
819e89516f0SMike Frysinger             state->mode = MATCH;
820e89516f0SMike Frysinger         case MATCH:
821e89516f0SMike Frysinger             if (left == 0) goto inf_leave;
822e89516f0SMike Frysinger             copy = out - left;
823e89516f0SMike Frysinger             if (state->offset > copy) {         /* copy from window */
824e89516f0SMike Frysinger                 copy = state->offset - copy;
825e89516f0SMike Frysinger                 if (copy > state->write) {
826e89516f0SMike Frysinger                     copy -= state->write;
827e89516f0SMike Frysinger                     from = state->window + (state->wsize - copy);
828e89516f0SMike Frysinger                 }
829e89516f0SMike Frysinger                 else
830e89516f0SMike Frysinger                     from = state->window + (state->write - copy);
831e89516f0SMike Frysinger                 if (copy > state->length) copy = state->length;
832e89516f0SMike Frysinger             }
833e89516f0SMike Frysinger             else {                              /* copy from output */
834e89516f0SMike Frysinger                 from = put - state->offset;
835e89516f0SMike Frysinger                 copy = state->length;
836e89516f0SMike Frysinger             }
837e89516f0SMike Frysinger             if (copy > left) copy = left;
838e89516f0SMike Frysinger             left -= copy;
839e89516f0SMike Frysinger             state->length -= copy;
840e89516f0SMike Frysinger             do {
841e89516f0SMike Frysinger                 *put++ = *from++;
842e89516f0SMike Frysinger             } while (--copy);
843e89516f0SMike Frysinger             if (state->length == 0) state->mode = LEN;
844e89516f0SMike Frysinger             break;
845e89516f0SMike Frysinger         case LIT:
846e89516f0SMike Frysinger             if (left == 0) goto inf_leave;
847e89516f0SMike Frysinger             *put++ = (unsigned char)(state->length);
848e89516f0SMike Frysinger             left--;
849e89516f0SMike Frysinger             state->mode = LEN;
850e89516f0SMike Frysinger             break;
851e89516f0SMike Frysinger         case CHECK:
852e89516f0SMike Frysinger             if (state->wrap) {
853e89516f0SMike Frysinger                 NEEDBITS(32);
854e89516f0SMike Frysinger                 out -= left;
855e89516f0SMike Frysinger                 strm->total_out += out;
856e89516f0SMike Frysinger                 state->total += out;
857e89516f0SMike Frysinger                 if (out)
858e89516f0SMike Frysinger                     strm->adler = state->check =
859e89516f0SMike Frysinger                         UPDATE(state->check, put - out, out);
860e89516f0SMike Frysinger                 out = left;
861e89516f0SMike Frysinger                 if ((
862e89516f0SMike Frysinger #ifdef GUNZIP
863e89516f0SMike Frysinger                      state->flags ? hold :
864e89516f0SMike Frysinger #endif
865e89516f0SMike Frysinger                      REVERSE(hold)) != state->check) {
866e89516f0SMike Frysinger                     strm->msg = (char *)"incorrect data check";
867e89516f0SMike Frysinger                     state->mode = BAD;
868e89516f0SMike Frysinger                     break;
869e89516f0SMike Frysinger                 }
870e89516f0SMike Frysinger                 INITBITS();
871e89516f0SMike Frysinger                 Tracev((stderr, "inflate:   check matches trailer\n"));
872e89516f0SMike Frysinger             }
873e89516f0SMike Frysinger #ifdef GUNZIP
874e89516f0SMike Frysinger             state->mode = LENGTH;
875e89516f0SMike Frysinger         case LENGTH:
876e89516f0SMike Frysinger             if (state->wrap && state->flags) {
877e89516f0SMike Frysinger                 NEEDBITS(32);
878e89516f0SMike Frysinger                 if (hold != (state->total & 0xffffffffUL)) {
879e89516f0SMike Frysinger                     strm->msg = (char *)"incorrect length check";
880e89516f0SMike Frysinger                     state->mode = BAD;
881e89516f0SMike Frysinger                     break;
882e89516f0SMike Frysinger                 }
883e89516f0SMike Frysinger                 INITBITS();
884e89516f0SMike Frysinger                 Tracev((stderr, "inflate:   length matches trailer\n"));
885e89516f0SMike Frysinger             }
886e89516f0SMike Frysinger #endif
887e89516f0SMike Frysinger             state->mode = DONE;
888e89516f0SMike Frysinger         case DONE:
889e89516f0SMike Frysinger             ret = Z_STREAM_END;
890e89516f0SMike Frysinger             goto inf_leave;
891e89516f0SMike Frysinger         case BAD:
892e89516f0SMike Frysinger             ret = Z_DATA_ERROR;
893e89516f0SMike Frysinger             goto inf_leave;
894e89516f0SMike Frysinger         case MEM:
895e89516f0SMike Frysinger             return Z_MEM_ERROR;
896e89516f0SMike Frysinger         case SYNC:
897e89516f0SMike Frysinger         default:
898e89516f0SMike Frysinger             return Z_STREAM_ERROR;
899e89516f0SMike Frysinger         }
900e89516f0SMike Frysinger 
901e89516f0SMike Frysinger     /*
902e89516f0SMike Frysinger        Return from inflate(), updating the total counts and the check value.
903e89516f0SMike Frysinger        If there was no progress during the inflate() call, return a buffer
904e89516f0SMike Frysinger        error.  Call updatewindow() to create and/or update the window state.
905e89516f0SMike Frysinger        Note: a memory error from inflate() is non-recoverable.
906e89516f0SMike Frysinger      */
907e89516f0SMike Frysinger   inf_leave:
908e89516f0SMike Frysinger     RESTORE();
909e89516f0SMike Frysinger     if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
910e89516f0SMike Frysinger         if (updatewindow(strm, out)) {
911e89516f0SMike Frysinger             state->mode = MEM;
912e89516f0SMike Frysinger             return Z_MEM_ERROR;
913e89516f0SMike Frysinger         }
914e89516f0SMike Frysinger     in -= strm->avail_in;
915e89516f0SMike Frysinger     out -= strm->avail_out;
916e89516f0SMike Frysinger     strm->total_in += in;
917e89516f0SMike Frysinger     strm->total_out += out;
918e89516f0SMike Frysinger     state->total += out;
919e89516f0SMike Frysinger     if (state->wrap && out)
920e89516f0SMike Frysinger         strm->adler = state->check =
921e89516f0SMike Frysinger             UPDATE(state->check, strm->next_out - out, out);
922e89516f0SMike Frysinger     strm->data_type = state->bits + (state->last ? 64 : 0) +
923e89516f0SMike Frysinger                       (state->mode == TYPE ? 128 : 0);
924e89516f0SMike Frysinger     if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
925e89516f0SMike Frysinger         ret = Z_BUF_ERROR;
926e89516f0SMike Frysinger     return ret;
927e89516f0SMike Frysinger }
928e89516f0SMike Frysinger 
inflateEnd(z_streamp strm)929*ee820b5eSKim Phillips int ZEXPORT inflateEnd(z_streamp strm)
930e89516f0SMike Frysinger {
931e89516f0SMike Frysinger     struct inflate_state FAR *state;
932e89516f0SMike Frysinger     if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
933e89516f0SMike Frysinger         return Z_STREAM_ERROR;
934e89516f0SMike Frysinger     state = (struct inflate_state FAR *)strm->state;
935e89516f0SMike Frysinger     if (state->window != Z_NULL) {
936e89516f0SMike Frysinger 	WATCHDOG_RESET();
937e89516f0SMike Frysinger 	ZFREE(strm, state->window);
938e89516f0SMike Frysinger     }
939e89516f0SMike Frysinger     ZFREE(strm, strm->state);
940e89516f0SMike Frysinger     strm->state = Z_NULL;
941e89516f0SMike Frysinger     Tracev((stderr, "inflate: end\n"));
942e89516f0SMike Frysinger     return Z_OK;
943e89516f0SMike Frysinger }
944