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