xref: /openbsd-src/sys/lib/libz/inflate.c (revision 5a38ef86d0b61900239c7913d24a05e7b88a58f0)
1 /*	$OpenBSD: inflate.c,v 1.17 2021/07/22 16:40:20 tb Exp $ */
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 
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 
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 
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 
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, 1U << state->wbits);
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 
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, sizeof(struct inflate_state));
235         strm->state = Z_NULL;
236     }
237     return ret;
238 }
239 
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 
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  */
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  */
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  */
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 
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 #ifdef SMALL
683                 strm->msg = "error";
684 #else
685                 strm->msg = (char *)"incorrect header check";
686 #endif
687                 state->mode = BAD;
688                 break;
689             }
690             if (BITS(4) != Z_DEFLATED) {
691 #ifdef SMALL
692                 strm->msg = "error";
693 #else
694                 strm->msg = (char *)"unknown compression method";
695 #endif
696                 state->mode = BAD;
697                 break;
698             }
699             DROPBITS(4);
700             len = BITS(4) + 8;
701             if (state->wbits == 0)
702                 state->wbits = len;
703             if (len > 15 || len > state->wbits) {
704 #ifdef SMALL
705                 strm->msg = "error";
706 #else
707                 strm->msg = (char *)"invalid window size";
708 #endif
709                 state->mode = BAD;
710                 break;
711             }
712             state->dmax = 1U << len;
713             Tracev((stderr, "inflate:   zlib header ok\n"));
714             strm->adler = state->check = adler32(0L, Z_NULL, 0);
715             state->mode = hold & 0x200 ? DICTID : TYPE;
716             INITBITS();
717             break;
718 #ifdef GUNZIP
719         case FLAGS:
720             NEEDBITS(16);
721             state->flags = (int)(hold);
722             if ((state->flags & 0xff) != Z_DEFLATED) {
723 #ifdef SMALL
724                 strm->msg = "error";
725 #else
726                 strm->msg = (char *)"unknown compression method";
727 #endif
728                 state->mode = BAD;
729                 break;
730             }
731             if (state->flags & 0xe000) {
732 #ifdef SMALL
733                 strm->msg = "error";
734 #else
735                 strm->msg = (char *)"unknown header flags set";
736 #endif
737                 state->mode = BAD;
738                 break;
739             }
740             if (state->head != Z_NULL)
741                 state->head->text = (int)((hold >> 8) & 1);
742             if ((state->flags & 0x0200) && (state->wrap & 4))
743                 CRC2(state->check, hold);
744             INITBITS();
745             state->mode = TIME;
746         case TIME:
747             NEEDBITS(32);
748             if (state->head != Z_NULL)
749                 state->head->time = hold;
750             if ((state->flags & 0x0200) && (state->wrap & 4))
751                 CRC4(state->check, hold);
752             INITBITS();
753             state->mode = OS;
754         case OS:
755             NEEDBITS(16);
756             if (state->head != Z_NULL) {
757                 state->head->xflags = (int)(hold & 0xff);
758                 state->head->os = (int)(hold >> 8);
759             }
760             if ((state->flags & 0x0200) && (state->wrap & 4))
761                 CRC2(state->check, hold);
762             INITBITS();
763             state->mode = EXLEN;
764         case EXLEN:
765             if (state->flags & 0x0400) {
766                 NEEDBITS(16);
767                 state->length = (unsigned)(hold);
768                 if (state->head != Z_NULL)
769                     state->head->extra_len = (unsigned)hold;
770                 if ((state->flags & 0x0200) && (state->wrap & 4))
771                     CRC2(state->check, hold);
772                 INITBITS();
773             }
774             else if (state->head != Z_NULL)
775                 state->head->extra = Z_NULL;
776             state->mode = EXTRA;
777         case EXTRA:
778             if (state->flags & 0x0400) {
779                 copy = state->length;
780                 if (copy > have) copy = have;
781                 if (copy) {
782                     if (state->head != Z_NULL &&
783                         state->head->extra != Z_NULL) {
784                         len = state->head->extra_len - state->length;
785                         zmemcpy(state->head->extra + len, next,
786                                 len + copy > state->head->extra_max ?
787                                 state->head->extra_max - len : copy);
788                     }
789                     if ((state->flags & 0x0200) && (state->wrap & 4))
790                         state->check = crc32(state->check, next, copy);
791                     have -= copy;
792                     next += copy;
793                     state->length -= copy;
794                 }
795                 if (state->length) goto inf_leave;
796             }
797             state->length = 0;
798             state->mode = NAME;
799         case NAME:
800             if (state->flags & 0x0800) {
801                 if (have == 0) goto inf_leave;
802                 copy = 0;
803                 do {
804                     len = (unsigned)(next[copy++]);
805                     if (state->head != Z_NULL &&
806                             state->head->name != Z_NULL &&
807                             state->length < state->head->name_max)
808                         state->head->name[state->length++] = (Bytef)len;
809                 } while (len && copy < have);
810                 if ((state->flags & 0x0200) && (state->wrap & 4))
811                     state->check = crc32(state->check, next, copy);
812                 have -= copy;
813                 next += copy;
814                 if (len) goto inf_leave;
815             }
816             else if (state->head != Z_NULL)
817                 state->head->name = Z_NULL;
818             state->length = 0;
819             state->mode = COMMENT;
820         case COMMENT:
821             if (state->flags & 0x1000) {
822                 if (have == 0) goto inf_leave;
823                 copy = 0;
824                 do {
825                     len = (unsigned)(next[copy++]);
826                     if (state->head != Z_NULL &&
827                             state->head->comment != Z_NULL &&
828                             state->length < state->head->comm_max)
829                         state->head->comment[state->length++] = (Bytef)len;
830                 } while (len && copy < have);
831                 if ((state->flags & 0x0200) && (state->wrap & 4))
832                     state->check = crc32(state->check, next, copy);
833                 have -= copy;
834                 next += copy;
835                 if (len) goto inf_leave;
836             }
837             else if (state->head != Z_NULL)
838                 state->head->comment = Z_NULL;
839             state->mode = HCRC;
840         case HCRC:
841             if (state->flags & 0x0200) {
842                 NEEDBITS(16);
843                 if ((state->wrap & 4) && hold != (state->check & 0xffff)) {
844 #ifdef SMALL
845                     strm->msg = "error";
846 #else
847                     strm->msg = (char *)"header crc mismatch";
848 #endif
849                     state->mode = BAD;
850                     break;
851                 }
852                 INITBITS();
853             }
854             if (state->head != Z_NULL) {
855                 state->head->hcrc = (int)((state->flags >> 9) & 1);
856                 state->head->done = 1;
857             }
858             strm->adler = state->check = crc32(0L, Z_NULL, 0);
859             state->mode = TYPE;
860             break;
861 #endif
862         case DICTID:
863             NEEDBITS(32);
864             strm->adler = state->check = ZSWAP32(hold);
865             INITBITS();
866             state->mode = DICT;
867         case DICT:
868             if (state->havedict == 0) {
869                 RESTORE();
870                 return Z_NEED_DICT;
871             }
872             strm->adler = state->check = adler32(0L, Z_NULL, 0);
873             state->mode = TYPE;
874         case TYPE:
875             if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
876         case TYPEDO:
877             if (state->last) {
878                 BYTEBITS();
879                 state->mode = CHECK;
880                 break;
881             }
882             NEEDBITS(3);
883             state->last = BITS(1);
884             DROPBITS(1);
885             switch (BITS(2)) {
886             case 0:                             /* stored block */
887                 Tracev((stderr, "inflate:     stored block%s\n",
888                         state->last ? " (last)" : ""));
889                 state->mode = STORED;
890                 break;
891             case 1:                             /* fixed block */
892                 fixedtables(state);
893                 Tracev((stderr, "inflate:     fixed codes block%s\n",
894                         state->last ? " (last)" : ""));
895                 state->mode = LEN_;             /* decode codes */
896                 if (flush == Z_TREES) {
897                     DROPBITS(2);
898                     goto inf_leave;
899                 }
900                 break;
901             case 2:                             /* dynamic block */
902                 Tracev((stderr, "inflate:     dynamic codes block%s\n",
903                         state->last ? " (last)" : ""));
904                 state->mode = TABLE;
905                 break;
906             case 3:
907 #ifdef SMALL
908                 strm->msg = "error";
909 #else
910                 strm->msg = (char *)"invalid block type";
911 #endif
912                 state->mode = BAD;
913             }
914             DROPBITS(2);
915             break;
916         case STORED:
917             BYTEBITS();                         /* go to byte boundary */
918             NEEDBITS(32);
919             if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
920 #ifdef SMALL
921                 strm->msg = "error";
922 #else
923                 strm->msg = (char *)"invalid stored block lengths";
924 #endif
925                 state->mode = BAD;
926                 break;
927             }
928             state->length = (unsigned)hold & 0xffff;
929             Tracev((stderr, "inflate:       stored length %u\n",
930                     state->length));
931             INITBITS();
932             state->mode = COPY_;
933             if (flush == Z_TREES) goto inf_leave;
934         case COPY_:
935             state->mode = COPY;
936         case COPY:
937             copy = state->length;
938             if (copy) {
939                 if (copy > have) copy = have;
940                 if (copy > left) copy = left;
941                 if (copy == 0) goto inf_leave;
942                 zmemcpy(put, next, copy);
943                 have -= copy;
944                 next += copy;
945                 left -= copy;
946                 put += copy;
947                 state->length -= copy;
948                 break;
949             }
950             Tracev((stderr, "inflate:       stored end\n"));
951             state->mode = TYPE;
952             break;
953         case TABLE:
954             NEEDBITS(14);
955             state->nlen = BITS(5) + 257;
956             DROPBITS(5);
957             state->ndist = BITS(5) + 1;
958             DROPBITS(5);
959             state->ncode = BITS(4) + 4;
960             DROPBITS(4);
961 #ifndef PKZIP_BUG_WORKAROUND
962             if (state->nlen > 286 || state->ndist > 30) {
963 #ifdef SMALL
964                 strm->msg = "error";
965 #else
966                 strm->msg = (char *)"too many length or distance symbols";
967 #endif
968                 state->mode = BAD;
969                 break;
970             }
971 #endif
972             Tracev((stderr, "inflate:       table sizes ok\n"));
973             state->have = 0;
974             state->mode = LENLENS;
975         case LENLENS:
976             while (state->have < state->ncode) {
977                 NEEDBITS(3);
978                 state->lens[order[state->have++]] = (unsigned short)BITS(3);
979                 DROPBITS(3);
980             }
981             while (state->have < 19)
982                 state->lens[order[state->have++]] = 0;
983             state->next = state->codes;
984             state->lencode = (const code FAR *)(state->next);
985             state->lenbits = 7;
986             ret = inflate_table(CODES, state->lens, 19, &(state->next),
987                                 &(state->lenbits), state->work);
988             if (ret) {
989 #ifdef SMALL
990                 strm->msg = "error";
991 #else
992                 strm->msg = (char *)"invalid code lengths set";
993 #endif
994                 state->mode = BAD;
995                 break;
996             }
997             Tracev((stderr, "inflate:       code lengths ok\n"));
998             state->have = 0;
999             state->mode = CODELENS;
1000         case CODELENS:
1001             while (state->have < state->nlen + state->ndist) {
1002                 for (;;) {
1003                     here = state->lencode[BITS(state->lenbits)];
1004                     if ((unsigned)(here.bits) <= bits) break;
1005                     PULLBYTE();
1006                 }
1007                 if (here.val < 16) {
1008                     DROPBITS(here.bits);
1009                     state->lens[state->have++] = here.val;
1010                 }
1011                 else {
1012                     if (here.val == 16) {
1013                         NEEDBITS(here.bits + 2);
1014                         DROPBITS(here.bits);
1015                         if (state->have == 0) {
1016 #ifdef SMALL
1017                             strm->msg = "error";
1018 #else
1019                             strm->msg = (char *)"invalid bit length repeat";
1020 #endif
1021                             state->mode = BAD;
1022                             break;
1023                         }
1024                         len = state->lens[state->have - 1];
1025                         copy = 3 + BITS(2);
1026                         DROPBITS(2);
1027                     }
1028                     else if (here.val == 17) {
1029                         NEEDBITS(here.bits + 3);
1030                         DROPBITS(here.bits);
1031                         len = 0;
1032                         copy = 3 + BITS(3);
1033                         DROPBITS(3);
1034                     }
1035                     else {
1036                         NEEDBITS(here.bits + 7);
1037                         DROPBITS(here.bits);
1038                         len = 0;
1039                         copy = 11 + BITS(7);
1040                         DROPBITS(7);
1041                     }
1042                     if (state->have + copy > state->nlen + state->ndist) {
1043 #ifdef SMALL
1044                         strm->msg = "error";
1045 #else
1046                         strm->msg = (char *)"invalid bit length repeat";
1047 #endif
1048                         state->mode = BAD;
1049                         break;
1050                     }
1051                     while (copy--)
1052                         state->lens[state->have++] = (unsigned short)len;
1053                 }
1054             }
1055 
1056             /* handle error breaks in while */
1057             if (state->mode == BAD) break;
1058 
1059             /* check for end-of-block code (better have one) */
1060             if (state->lens[256] == 0) {
1061 #ifdef SMALL
1062                 strm->msg = "error";
1063 #else
1064                 strm->msg = (char *)"invalid code -- missing end-of-block";
1065 #endif
1066                 state->mode = BAD;
1067                 break;
1068             }
1069 
1070             /* build code tables -- note: do not change the lenbits or distbits
1071                values here (9 and 6) without reading the comments in inftrees.h
1072                concerning the ENOUGH constants, which depend on those values */
1073             state->next = state->codes;
1074             state->lencode = (const code FAR *)(state->next);
1075             state->lenbits = 9;
1076             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
1077                                 &(state->lenbits), state->work);
1078             if (ret) {
1079 #ifdef SMALL
1080                 strm->msg = "error";
1081 #else
1082                 strm->msg = (char *)"invalid literal/lengths set";
1083 #endif
1084                 state->mode = BAD;
1085                 break;
1086             }
1087             state->distcode = (const code FAR *)(state->next);
1088             state->distbits = 6;
1089             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
1090                             &(state->next), &(state->distbits), state->work);
1091             if (ret) {
1092 #ifdef SMALL
1093                 strm->msg = "error";
1094 #else
1095                 strm->msg = (char *)"invalid distances set";
1096 #endif
1097                 state->mode = BAD;
1098                 break;
1099             }
1100             Tracev((stderr, "inflate:       codes ok\n"));
1101             state->mode = LEN_;
1102             if (flush == Z_TREES) goto inf_leave;
1103         case LEN_:
1104             state->mode = LEN;
1105         case LEN:
1106 #ifndef SLOW
1107             if (have >= 6 && left >= 258) {
1108                 RESTORE();
1109                 inflate_fast(strm, out);
1110                 LOAD();
1111                 if (state->mode == TYPE)
1112                     state->back = -1;
1113                 break;
1114             }
1115 #endif
1116             state->back = 0;
1117             for (;;) {
1118                 here = state->lencode[BITS(state->lenbits)];
1119                 if ((unsigned)(here.bits) <= bits) break;
1120                 PULLBYTE();
1121             }
1122             if (here.op && (here.op & 0xf0) == 0) {
1123                 last = here;
1124                 for (;;) {
1125                     here = state->lencode[last.val +
1126                             (BITS(last.bits + last.op) >> last.bits)];
1127                     if ((unsigned)(last.bits + here.bits) <= bits) break;
1128                     PULLBYTE();
1129                 }
1130                 DROPBITS(last.bits);
1131                 state->back += last.bits;
1132             }
1133             DROPBITS(here.bits);
1134             state->back += here.bits;
1135             state->length = (unsigned)here.val;
1136             if ((int)(here.op) == 0) {
1137                 Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
1138                         "inflate:         literal '%c'\n" :
1139                         "inflate:         literal 0x%02x\n", here.val));
1140                 state->mode = LIT;
1141                 break;
1142             }
1143             if (here.op & 32) {
1144                 Tracevv((stderr, "inflate:         end of block\n"));
1145                 state->back = -1;
1146                 state->mode = TYPE;
1147                 break;
1148             }
1149             if (here.op & 64) {
1150 #ifdef SMALL
1151                 strm->msg = "error";
1152 #else
1153                 strm->msg = (char *)"invalid literal/length code";
1154 #endif
1155                 state->mode = BAD;
1156                 break;
1157             }
1158             state->extra = (unsigned)(here.op) & 15;
1159             state->mode = LENEXT;
1160         case LENEXT:
1161             if (state->extra) {
1162                 NEEDBITS(state->extra);
1163                 state->length += BITS(state->extra);
1164                 DROPBITS(state->extra);
1165                 state->back += state->extra;
1166             }
1167             Tracevv((stderr, "inflate:         length %u\n", state->length));
1168             state->was = state->length;
1169             state->mode = DIST;
1170         case DIST:
1171             for (;;) {
1172                 here = state->distcode[BITS(state->distbits)];
1173                 if ((unsigned)(here.bits) <= bits) break;
1174                 PULLBYTE();
1175             }
1176             if ((here.op & 0xf0) == 0) {
1177                 last = here;
1178                 for (;;) {
1179                     here = state->distcode[last.val +
1180                             (BITS(last.bits + last.op) >> last.bits)];
1181                     if ((unsigned)(last.bits + here.bits) <= bits) break;
1182                     PULLBYTE();
1183                 }
1184                 DROPBITS(last.bits);
1185                 state->back += last.bits;
1186             }
1187             DROPBITS(here.bits);
1188             state->back += here.bits;
1189             if (here.op & 64) {
1190 #ifdef SMALL
1191                 strm->msg = "error";
1192 #else
1193                 strm->msg = (char *)"invalid distance code";
1194 #endif
1195                 state->mode = BAD;
1196                 break;
1197             }
1198             state->offset = (unsigned)here.val;
1199             state->extra = (unsigned)(here.op) & 15;
1200             state->mode = DISTEXT;
1201         case DISTEXT:
1202             if (state->extra) {
1203                 NEEDBITS(state->extra);
1204                 state->offset += BITS(state->extra);
1205                 DROPBITS(state->extra);
1206                 state->back += state->extra;
1207             }
1208 #ifdef INFLATE_STRICT
1209             if (state->offset > state->dmax) {
1210 #ifdef SMALL
1211                 strm->msg = "error";
1212 #else
1213                 strm->msg = (char *)"invalid distance too far back";
1214 #endif
1215                 state->mode = BAD;
1216                 break;
1217             }
1218 #endif
1219             Tracevv((stderr, "inflate:         distance %u\n", state->offset));
1220             state->mode = MATCH;
1221         case MATCH:
1222             if (left == 0) goto inf_leave;
1223             copy = out - left;
1224             if (state->offset > copy) {         /* copy from window */
1225                 copy = state->offset - copy;
1226                 if (copy > state->whave) {
1227                     if (state->sane) {
1228 #ifdef SMALL
1229                         strm->msg = "error";
1230 #else
1231                         strm->msg = (char *)"invalid distance too far back";
1232 #endif
1233                         state->mode = BAD;
1234                         break;
1235                     }
1236 #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1237                     Trace((stderr, "inflate.c too far\n"));
1238                     copy -= state->whave;
1239                     if (copy > state->length) copy = state->length;
1240                     if (copy > left) copy = left;
1241                     left -= copy;
1242                     state->length -= copy;
1243                     do {
1244                         *put++ = 0;
1245                     } while (--copy);
1246                     if (state->length == 0) state->mode = LEN;
1247                     break;
1248 #endif
1249                 }
1250                 if (copy > state->wnext) {
1251                     copy -= state->wnext;
1252                     from = state->window + (state->wsize - copy);
1253                 }
1254                 else
1255                     from = state->window + (state->wnext - copy);
1256                 if (copy > state->length) copy = state->length;
1257             }
1258             else {                              /* copy from output */
1259                 from = put - state->offset;
1260                 copy = state->length;
1261             }
1262             if (copy > left) copy = left;
1263             left -= copy;
1264             state->length -= copy;
1265             do {
1266                 *put++ = *from++;
1267             } while (--copy);
1268             if (state->length == 0) state->mode = LEN;
1269             break;
1270         case LIT:
1271             if (left == 0) goto inf_leave;
1272             *put++ = (unsigned char)(state->length);
1273             left--;
1274             state->mode = LEN;
1275             break;
1276         case CHECK:
1277             if (state->wrap) {
1278                 NEEDBITS(32);
1279                 out -= left;
1280                 strm->total_out += out;
1281                 state->total += out;
1282                 if ((state->wrap & 4) && out)
1283                     strm->adler = state->check =
1284                         UPDATE(state->check, put - out, out);
1285                 out = left;
1286                 if ((state->wrap & 4) && (
1287 #ifdef GUNZIP
1288                      state->flags ? hold :
1289 #endif
1290                      ZSWAP32(hold)) != state->check) {
1291 #ifdef SMALL
1292                     strm->msg = "error";
1293 #else
1294                     strm->msg = (char *)"incorrect data check";
1295 #endif
1296                     state->mode = BAD;
1297                     break;
1298                 }
1299                 INITBITS();
1300                 Tracev((stderr, "inflate:   check matches trailer\n"));
1301             }
1302 #ifdef GUNZIP
1303             state->mode = LENGTH;
1304         case LENGTH:
1305             if (state->wrap && state->flags) {
1306                 NEEDBITS(32);
1307                 if (hold != (state->total & 0xffffffffUL)) {
1308 #ifdef SMALL
1309                     strm->msg = "error";
1310 #else
1311                     strm->msg = (char *)"incorrect length check";
1312 #endif
1313                     state->mode = BAD;
1314                     break;
1315                 }
1316                 INITBITS();
1317                 Tracev((stderr, "inflate:   length matches trailer\n"));
1318             }
1319 #endif
1320             state->mode = DONE;
1321         case DONE:
1322             ret = Z_STREAM_END;
1323             goto inf_leave;
1324         case BAD:
1325             ret = Z_DATA_ERROR;
1326             goto inf_leave;
1327         case MEM:
1328             return Z_MEM_ERROR;
1329         case SYNC:
1330         default:
1331             return Z_STREAM_ERROR;
1332         }
1333 
1334     /*
1335        Return from inflate(), updating the total counts and the check value.
1336        If there was no progress during the inflate() call, return a buffer
1337        error.  Call updatewindow() to create and/or update the window state.
1338        Note: a memory error from inflate() is non-recoverable.
1339      */
1340   inf_leave:
1341     RESTORE();
1342     if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
1343             (state->mode < CHECK || flush != Z_FINISH)))
1344         if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {
1345             state->mode = MEM;
1346             return Z_MEM_ERROR;
1347         }
1348     in -= strm->avail_in;
1349     out -= strm->avail_out;
1350     strm->total_in += in;
1351     strm->total_out += out;
1352     state->total += out;
1353     if ((state->wrap & 4) && out)
1354         strm->adler = state->check =
1355             UPDATE(state->check, strm->next_out - out, out);
1356     strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
1357                       (state->mode == TYPE ? 128 : 0) +
1358                       (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
1359     if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
1360         ret = Z_BUF_ERROR;
1361     return ret;
1362 }
1363 
1364 int ZEXPORT inflateEnd(strm)
1365 z_streamp strm;
1366 {
1367     struct inflate_state FAR *state;
1368     if (inflateStateCheck(strm))
1369         return Z_STREAM_ERROR;
1370     state = (struct inflate_state FAR *)strm->state;
1371     if (state->window != Z_NULL) ZFREE(strm, state->window, 1U << state->wbits);
1372     ZFREE(strm, strm->state, sizeof(struct inflate_state));
1373     strm->state = Z_NULL;
1374     Tracev((stderr, "inflate: end\n"));
1375     return Z_OK;
1376 }
1377 
1378 int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength)
1379 z_streamp strm;
1380 Bytef *dictionary;
1381 uInt *dictLength;
1382 {
1383     struct inflate_state FAR *state;
1384 
1385     /* check state */
1386     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1387     state = (struct inflate_state FAR *)strm->state;
1388 
1389     /* copy dictionary */
1390     if (state->whave && dictionary != Z_NULL) {
1391         zmemcpy(dictionary, state->window + state->wnext,
1392                 state->whave - state->wnext);
1393         zmemcpy(dictionary + state->whave - state->wnext,
1394                 state->window, state->wnext);
1395     }
1396     if (dictLength != Z_NULL)
1397         *dictLength = state->whave;
1398     return Z_OK;
1399 }
1400 
1401 int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
1402 z_streamp strm;
1403 const Bytef *dictionary;
1404 uInt dictLength;
1405 {
1406     struct inflate_state FAR *state;
1407     unsigned long dictid;
1408     int ret;
1409 
1410     /* check state */
1411     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1412     state = (struct inflate_state FAR *)strm->state;
1413     if (state->wrap != 0 && state->mode != DICT)
1414         return Z_STREAM_ERROR;
1415 
1416     /* check for correct dictionary identifier */
1417     if (state->mode == DICT) {
1418         dictid = adler32(0L, Z_NULL, 0);
1419         dictid = adler32(dictid, dictionary, dictLength);
1420         if (dictid != state->check)
1421             return Z_DATA_ERROR;
1422     }
1423 
1424     /* copy dictionary to window using updatewindow(), which will amend the
1425        existing dictionary if appropriate */
1426     ret = updatewindow(strm, dictionary + dictLength, dictLength);
1427     if (ret) {
1428         state->mode = MEM;
1429         return Z_MEM_ERROR;
1430     }
1431     state->havedict = 1;
1432     Tracev((stderr, "inflate:   dictionary set\n"));
1433     return Z_OK;
1434 }
1435 
1436 int ZEXPORT inflateGetHeader(strm, head)
1437 z_streamp strm;
1438 gz_headerp head;
1439 {
1440     struct inflate_state FAR *state;
1441 
1442     /* check state */
1443     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1444     state = (struct inflate_state FAR *)strm->state;
1445     if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
1446 
1447     /* save header structure */
1448     state->head = head;
1449     head->done = 0;
1450     return Z_OK;
1451 }
1452 
1453 /*
1454    Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff.  Return when found
1455    or when out of input.  When called, *have is the number of pattern bytes
1456    found in order so far, in 0..3.  On return *have is updated to the new
1457    state.  If on return *have equals four, then the pattern was found and the
1458    return value is how many bytes were read including the last byte of the
1459    pattern.  If *have is less than four, then the pattern has not been found
1460    yet and the return value is len.  In the latter case, syncsearch() can be
1461    called again with more data and the *have state.  *have is initialized to
1462    zero for the first call.
1463  */
1464 local unsigned syncsearch(have, buf, len)
1465 unsigned FAR *have;
1466 const unsigned char FAR *buf;
1467 unsigned len;
1468 {
1469     unsigned got;
1470     unsigned next;
1471 
1472     got = *have;
1473     next = 0;
1474     while (next < len && got < 4) {
1475         if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
1476             got++;
1477         else if (buf[next])
1478             got = 0;
1479         else
1480             got = 4 - got;
1481         next++;
1482     }
1483     *have = got;
1484     return next;
1485 }
1486 
1487 int ZEXPORT inflateSync(strm)
1488 z_streamp strm;
1489 {
1490     unsigned len;               /* number of bytes to look at or looked at */
1491     unsigned long in, out;      /* temporary to save total_in and total_out */
1492     unsigned char buf[4];       /* to restore bit buffer to byte string */
1493     struct inflate_state FAR *state;
1494 
1495     /* check parameters */
1496     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1497     state = (struct inflate_state FAR *)strm->state;
1498     if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
1499 
1500     /* if first time, start search in bit buffer */
1501     if (state->mode != SYNC) {
1502         state->mode = SYNC;
1503         state->hold <<= state->bits & 7;
1504         state->bits -= state->bits & 7;
1505         len = 0;
1506         while (state->bits >= 8) {
1507             buf[len++] = (unsigned char)(state->hold);
1508             state->hold >>= 8;
1509             state->bits -= 8;
1510         }
1511         state->have = 0;
1512         syncsearch(&(state->have), buf, len);
1513     }
1514 
1515     /* search available input */
1516     len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
1517     strm->avail_in -= len;
1518     strm->next_in += len;
1519     strm->total_in += len;
1520 
1521     /* return no joy or set up to restart inflate() on a new block */
1522     if (state->have != 4) return Z_DATA_ERROR;
1523     in = strm->total_in;  out = strm->total_out;
1524     inflateReset(strm);
1525     strm->total_in = in;  strm->total_out = out;
1526     state->mode = TYPE;
1527     return Z_OK;
1528 }
1529 
1530 /*
1531    Returns true if inflate is currently at the end of a block generated by
1532    Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
1533    implementation to provide an additional safety check. PPP uses
1534    Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
1535    block. When decompressing, PPP checks that at the end of input packet,
1536    inflate is waiting for these length bytes.
1537  */
1538 int ZEXPORT inflateSyncPoint(strm)
1539 z_streamp strm;
1540 {
1541     struct inflate_state FAR *state;
1542 
1543     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1544     state = (struct inflate_state FAR *)strm->state;
1545     return state->mode == STORED && state->bits == 0;
1546 }
1547 
1548 int ZEXPORT inflateCopy(dest, source)
1549 z_streamp dest;
1550 z_streamp source;
1551 {
1552     struct inflate_state FAR *state;
1553     struct inflate_state FAR *copy;
1554     unsigned char FAR *window;
1555     unsigned wsize;
1556 
1557     /* check input */
1558     if (inflateStateCheck(source) || dest == Z_NULL)
1559         return Z_STREAM_ERROR;
1560     state = (struct inflate_state FAR *)source->state;
1561 
1562     /* allocate space */
1563     copy = (struct inflate_state FAR *)
1564            ZALLOC(source, 1, sizeof(struct inflate_state));
1565     if (copy == Z_NULL) return Z_MEM_ERROR;
1566     window = Z_NULL;
1567     if (state->window != Z_NULL) {
1568         window = (unsigned char FAR *)
1569                  ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
1570         if (window == Z_NULL) {
1571             ZFREE(source, copy, sizeof(struct inflate_state));
1572             return Z_MEM_ERROR;
1573         }
1574     }
1575 
1576     /* copy state */
1577     zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
1578     zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));
1579     copy->strm = dest;
1580     if (state->lencode >= state->codes &&
1581         state->lencode <= state->codes + ENOUGH - 1) {
1582         copy->lencode = copy->codes + (state->lencode - state->codes);
1583         copy->distcode = copy->codes + (state->distcode - state->codes);
1584     }
1585     copy->next = copy->codes + (state->next - state->codes);
1586     if (window != Z_NULL) {
1587         wsize = 1U << state->wbits;
1588         zmemcpy(window, state->window, wsize);
1589     }
1590     copy->window = window;
1591     dest->state = (struct internal_state FAR *)copy;
1592     return Z_OK;
1593 }
1594 
1595 int ZEXPORT inflateUndermine(strm, subvert)
1596 z_streamp strm;
1597 int subvert;
1598 {
1599     struct inflate_state FAR *state;
1600 
1601     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1602     state = (struct inflate_state FAR *)strm->state;
1603 #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1604     state->sane = !subvert;
1605     return Z_OK;
1606 #else
1607     (void)subvert;
1608     state->sane = 1;
1609     return Z_DATA_ERROR;
1610 #endif
1611 }
1612 
1613 int ZEXPORT inflateValidate(strm, check)
1614 z_streamp strm;
1615 int check;
1616 {
1617     struct inflate_state FAR *state;
1618 
1619     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1620     state = (struct inflate_state FAR *)strm->state;
1621     if (check)
1622         state->wrap |= 4;
1623     else
1624         state->wrap &= ~4;
1625     return Z_OK;
1626 }
1627 
1628 long ZEXPORT inflateMark(strm)
1629 z_streamp strm;
1630 {
1631     struct inflate_state FAR *state;
1632 
1633     if (inflateStateCheck(strm))
1634         return -(1L << 16);
1635     state = (struct inflate_state FAR *)strm->state;
1636     return (long)(((unsigned long)((long)state->back)) << 16) +
1637         (state->mode == COPY ? state->length :
1638             (state->mode == MATCH ? state->was - state->length : 0));
1639 }
1640 
1641 unsigned long ZEXPORT inflateCodesUsed(strm)
1642 z_streamp strm;
1643 {
1644     struct inflate_state FAR *state;
1645     if (inflateStateCheck(strm)) return (unsigned long)-1;
1646     state = (struct inflate_state FAR *)strm->state;
1647     return (unsigned long)(state->next - state->codes);
1648 }
1649