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