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