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