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