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