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