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