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