1 /* $NetBSD: inflate.c,v 1.3 2006/05/13 22:05:04 christos 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 */ 97 local void fixedtables OF((struct inflate_state FAR *state)); 98 local int updatewindow OF((z_streamp strm, unsigned out)); 99 #ifdef BUILDFIXED 100 void makefixed OF((void)); 101 #endif 102 local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, 103 unsigned len)); 104 105 int ZEXPORT inflateReset(strm) 106 z_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 130 int ZEXPORT inflatePrime(strm, bits, value) 131 z_streamp strm; 132 int bits; 133 int 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 146 int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) 147 z_streamp strm; 148 int windowBits; 149 const char *version; 150 int 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 189 int ZEXPORT inflateInit_(strm, version, stream_size) 190 z_streamp strm; 191 const char *version; 192 int 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 */ 207 local void fixedtables(state) 208 struct 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 */ 271 void 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 */ 325 local int updatewindow(strm, out) 326 z_streamp strm; 327 unsigned 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 556 int ZEXPORT inflate(strm, flush) 557 z_streamp strm; 558 int 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 (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || 580 (strm->next_in == Z_NULL && strm->avail_in != 0)) 581 return Z_STREAM_ERROR; 582 583 state = (struct inflate_state FAR *)strm->state; 584 if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ 585 LOAD(); 586 in = have; 587 out = left; 588 ret = Z_OK; 589 for (;;) 590 switch (state->mode) { 591 case HEAD: 592 if (state->wrap == 0) { 593 state->mode = TYPEDO; 594 break; 595 } 596 NEEDBITS(16); 597 #ifdef GUNZIP 598 if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ 599 state->check = crc32(0L, Z_NULL, 0); 600 CRC2(state->check, hold); 601 INITBITS(); 602 state->mode = FLAGS; 603 break; 604 } 605 state->flags = 0; /* expect zlib header */ 606 if (state->head != Z_NULL) 607 state->head->done = -1; 608 if (!(state->wrap & 1) || /* check if zlib header allowed */ 609 #else 610 if ( 611 #endif 612 ((BITS(8) << 8) + (hold >> 8)) % 31) { 613 strm->msg = __UNCONST("incorrect header check"); 614 state->mode = BAD; 615 break; 616 } 617 if (BITS(4) != Z_DEFLATED) { 618 strm->msg = __UNCONST("unknown compression method"); 619 state->mode = BAD; 620 break; 621 } 622 DROPBITS(4); 623 len = BITS(4) + 8; 624 if (len > state->wbits) { 625 strm->msg = __UNCONST("invalid window size"); 626 state->mode = BAD; 627 break; 628 } 629 state->dmax = 1U << len; 630 Tracev((stderr, "inflate: zlib header ok\n")); 631 strm->adler = state->check = adler32(0L, Z_NULL, 0); 632 state->mode = hold & 0x200 ? DICTID : TYPE; 633 INITBITS(); 634 break; 635 #ifdef GUNZIP 636 case FLAGS: 637 NEEDBITS(16); 638 state->flags = (int)(hold); 639 if ((state->flags & 0xff) != Z_DEFLATED) { 640 strm->msg = __UNCONST("unknown compression method"); 641 state->mode = BAD; 642 break; 643 } 644 if (state->flags & 0xe000) { 645 strm->msg = __UNCONST("unknown header flags set"); 646 state->mode = BAD; 647 break; 648 } 649 if (state->head != Z_NULL) 650 state->head->text = (int)((hold >> 8) & 1); 651 if (state->flags & 0x0200) CRC2(state->check, hold); 652 INITBITS(); 653 state->mode = TIME; 654 case TIME: 655 NEEDBITS(32); 656 if (state->head != Z_NULL) 657 state->head->time = hold; 658 if (state->flags & 0x0200) CRC4(state->check, hold); 659 INITBITS(); 660 state->mode = OS; 661 case OS: 662 NEEDBITS(16); 663 if (state->head != Z_NULL) { 664 state->head->xflags = (int)(hold & 0xff); 665 state->head->os = (int)(hold >> 8); 666 } 667 if (state->flags & 0x0200) CRC2(state->check, hold); 668 INITBITS(); 669 state->mode = EXLEN; 670 case EXLEN: 671 if (state->flags & 0x0400) { 672 NEEDBITS(16); 673 state->length = (unsigned)(hold); 674 if (state->head != Z_NULL) 675 state->head->extra_len = (unsigned)hold; 676 if (state->flags & 0x0200) CRC2(state->check, hold); 677 INITBITS(); 678 } 679 else if (state->head != Z_NULL) 680 state->head->extra = Z_NULL; 681 state->mode = EXTRA; 682 case EXTRA: 683 if (state->flags & 0x0400) { 684 copy = state->length; 685 if (copy > have) copy = have; 686 if (copy) { 687 if (state->head != Z_NULL && 688 state->head->extra != Z_NULL) { 689 len = state->head->extra_len - state->length; 690 Assert (next != NULL, "next is null"); 691 zmemcpy(state->head->extra + len, next, 692 len + copy > state->head->extra_max ? 693 state->head->extra_max - len : copy); 694 } 695 if (state->flags & 0x0200) 696 state->check = crc32(state->check, next, copy); 697 have -= copy; 698 next += copy; 699 state->length -= copy; 700 } 701 if (state->length) goto inf_leave; 702 } 703 state->length = 0; 704 state->mode = NAME; 705 case NAME: 706 if (state->flags & 0x0800) { 707 if (have == 0) goto inf_leave; 708 copy = 0; 709 do { 710 len = (unsigned)(next[copy++]); 711 if (state->head != Z_NULL && 712 state->head->name != Z_NULL && 713 state->length < state->head->name_max) 714 state->head->name[state->length++] = len; 715 } while (len && copy < have); 716 if (state->flags & 0x0200) 717 state->check = crc32(state->check, next, copy); 718 have -= copy; 719 next += copy; 720 if (len) goto inf_leave; 721 } 722 else if (state->head != Z_NULL) 723 state->head->name = Z_NULL; 724 state->length = 0; 725 state->mode = COMMENT; 726 case COMMENT: 727 if (state->flags & 0x1000) { 728 if (have == 0) goto inf_leave; 729 copy = 0; 730 do { 731 len = (unsigned)(next[copy++]); 732 if (state->head != Z_NULL && 733 state->head->comment != Z_NULL && 734 state->length < state->head->comm_max) 735 state->head->comment[state->length++] = len; 736 } while (len && copy < have); 737 if (state->flags & 0x0200) 738 state->check = crc32(state->check, next, copy); 739 have -= copy; 740 next += copy; 741 if (len) goto inf_leave; 742 } 743 else if (state->head != Z_NULL) 744 state->head->comment = Z_NULL; 745 state->mode = HCRC; 746 case HCRC: 747 if (state->flags & 0x0200) { 748 NEEDBITS(16); 749 if (hold != (state->check & 0xffff)) { 750 strm->msg = __UNCONST("header crc mismatch"); 751 state->mode = BAD; 752 break; 753 } 754 INITBITS(); 755 } 756 if (state->head != Z_NULL) { 757 state->head->hcrc = (int)((state->flags >> 9) & 1); 758 state->head->done = 1; 759 } 760 strm->adler = state->check = crc32(0L, Z_NULL, 0); 761 state->mode = TYPE; 762 break; 763 #endif 764 case DICTID: 765 NEEDBITS(32); 766 strm->adler = state->check = REVERSE(hold); 767 INITBITS(); 768 state->mode = DICT; 769 case DICT: 770 if (state->havedict == 0) { 771 RESTORE(); 772 return Z_NEED_DICT; 773 } 774 strm->adler = state->check = adler32(0L, Z_NULL, 0); 775 state->mode = TYPE; 776 case TYPE: 777 if (flush == Z_BLOCK) goto inf_leave; 778 case TYPEDO: 779 if (state->last) { 780 BYTEBITS(); 781 state->mode = CHECK; 782 break; 783 } 784 NEEDBITS(3); 785 state->last = BITS(1); 786 DROPBITS(1); 787 switch (BITS(2)) { 788 case 0: /* stored block */ 789 Tracev((stderr, "inflate: stored block%s\n", 790 state->last ? " (last)" : "")); 791 state->mode = STORED; 792 break; 793 case 1: /* fixed block */ 794 fixedtables(state); 795 Tracev((stderr, "inflate: fixed codes block%s\n", 796 state->last ? " (last)" : "")); 797 state->mode = LEN; /* decode codes */ 798 break; 799 case 2: /* dynamic block */ 800 Tracev((stderr, "inflate: dynamic codes block%s\n", 801 state->last ? " (last)" : "")); 802 state->mode = TABLE; 803 break; 804 case 3: 805 strm->msg = __UNCONST("invalid block type"); 806 state->mode = BAD; 807 } 808 DROPBITS(2); 809 break; 810 case STORED: 811 BYTEBITS(); /* go to byte boundary */ 812 NEEDBITS(32); 813 if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { 814 strm->msg = __UNCONST("invalid stored block lengths"); 815 state->mode = BAD; 816 break; 817 } 818 state->length = (unsigned)hold & 0xffff; 819 Tracev((stderr, "inflate: stored length %u\n", 820 state->length)); 821 INITBITS(); 822 state->mode = COPY; 823 case COPY: 824 copy = state->length; 825 if (copy) { 826 if (copy > have) copy = have; 827 if (copy > left) copy = left; 828 if (copy == 0) goto inf_leave; 829 zmemcpy(put, next, copy); 830 have -= copy; 831 next += copy; 832 left -= copy; 833 put += copy; 834 state->length -= copy; 835 break; 836 } 837 Tracev((stderr, "inflate: stored end\n")); 838 state->mode = TYPE; 839 break; 840 case TABLE: 841 NEEDBITS(14); 842 state->nlen = BITS(5) + 257; 843 DROPBITS(5); 844 state->ndist = BITS(5) + 1; 845 DROPBITS(5); 846 state->ncode = BITS(4) + 4; 847 DROPBITS(4); 848 #ifndef PKZIP_BUG_WORKAROUND 849 if (state->nlen > 286 || state->ndist > 30) { 850 strm->msg = __UNCONST("too many length or distance symbols"); 851 state->mode = BAD; 852 break; 853 } 854 #endif 855 Tracev((stderr, "inflate: table sizes ok\n")); 856 state->have = 0; 857 state->mode = LENLENS; 858 case LENLENS: 859 while (state->have < state->ncode) { 860 NEEDBITS(3); 861 state->lens[order[state->have++]] = (unsigned short)BITS(3); 862 DROPBITS(3); 863 } 864 while (state->have < 19) 865 state->lens[order[state->have++]] = 0; 866 state->next = state->codes; 867 state->lencode = (code const FAR *)(state->next); 868 state->lenbits = 7; 869 ret = inflate_table(CODES, state->lens, 19, &(state->next), 870 &(state->lenbits), state->work); 871 if (ret) { 872 strm->msg = __UNCONST("invalid code lengths set"); 873 state->mode = BAD; 874 break; 875 } 876 Tracev((stderr, "inflate: code lengths ok\n")); 877 state->have = 0; 878 state->mode = CODELENS; 879 case CODELENS: 880 while (state->have < state->nlen + state->ndist) { 881 for (;;) { 882 this = state->lencode[BITS(state->lenbits)]; 883 if ((unsigned)(this.bits) <= bits) break; 884 PULLBYTE(); 885 } 886 if (this.val < 16) { 887 NEEDBITS(this.bits); 888 DROPBITS(this.bits); 889 state->lens[state->have++] = this.val; 890 } 891 else { 892 if (this.val == 16) { 893 NEEDBITS(this.bits + 2); 894 DROPBITS(this.bits); 895 if (state->have == 0) { 896 strm->msg = __UNCONST("invalid bit length repeat"); 897 state->mode = BAD; 898 break; 899 } 900 len = state->lens[state->have - 1]; 901 copy = 3 + BITS(2); 902 DROPBITS(2); 903 } 904 else if (this.val == 17) { 905 NEEDBITS(this.bits + 3); 906 DROPBITS(this.bits); 907 len = 0; 908 copy = 3 + BITS(3); 909 DROPBITS(3); 910 } 911 else { 912 NEEDBITS(this.bits + 7); 913 DROPBITS(this.bits); 914 len = 0; 915 copy = 11 + BITS(7); 916 DROPBITS(7); 917 } 918 if (state->have + copy > state->nlen + state->ndist) { 919 strm->msg = __UNCONST("invalid bit length repeat"); 920 state->mode = BAD; 921 break; 922 } 923 while (copy--) 924 state->lens[state->have++] = (unsigned short)len; 925 } 926 } 927 928 /* handle error breaks in while */ 929 if (state->mode == BAD) break; 930 931 /* build code tables */ 932 state->next = state->codes; 933 state->lencode = (code const FAR *)(state->next); 934 state->lenbits = 9; 935 ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), 936 &(state->lenbits), state->work); 937 if (ret) { 938 strm->msg = __UNCONST("invalid literal/lengths set"); 939 state->mode = BAD; 940 break; 941 } 942 state->distcode = (code const FAR *)(state->next); 943 state->distbits = 6; 944 ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, 945 &(state->next), &(state->distbits), state->work); 946 if (ret) { 947 strm->msg = __UNCONST("invalid distances set"); 948 state->mode = BAD; 949 break; 950 } 951 Tracev((stderr, "inflate: codes ok\n")); 952 state->mode = LEN; 953 case LEN: 954 if (have >= 6 && left >= 258) { 955 RESTORE(); 956 inflate_fast(strm, out); 957 LOAD(); 958 break; 959 } 960 for (;;) { 961 this = state->lencode[BITS(state->lenbits)]; 962 if ((unsigned)(this.bits) <= bits) break; 963 PULLBYTE(); 964 } 965 if (this.op && (this.op & 0xf0) == 0) { 966 last = this; 967 for (;;) { 968 this = state->lencode[last.val + 969 (BITS(last.bits + last.op) >> last.bits)]; 970 if ((unsigned)(last.bits + this.bits) <= bits) break; 971 PULLBYTE(); 972 } 973 DROPBITS(last.bits); 974 } 975 DROPBITS(this.bits); 976 state->length = (unsigned)this.val; 977 if ((int)(this.op) == 0) { 978 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? 979 "inflate: literal '%c'\n" : 980 "inflate: literal 0x%02x\n", this.val)); 981 state->mode = LIT; 982 break; 983 } 984 if (this.op & 32) { 985 Tracevv((stderr, "inflate: end of block\n")); 986 state->mode = TYPE; 987 break; 988 } 989 if (this.op & 64) { 990 strm->msg = __UNCONST("invalid literal/length code"); 991 state->mode = BAD; 992 break; 993 } 994 state->extra = (unsigned)(this.op) & 15; 995 state->mode = LENEXT; 996 case LENEXT: 997 if (state->extra) { 998 NEEDBITS(state->extra); 999 state->length += BITS(state->extra); 1000 DROPBITS(state->extra); 1001 } 1002 Tracevv((stderr, "inflate: length %u\n", state->length)); 1003 state->mode = DIST; 1004 case DIST: 1005 for (;;) { 1006 this = state->distcode[BITS(state->distbits)]; 1007 if ((unsigned)(this.bits) <= bits) break; 1008 PULLBYTE(); 1009 } 1010 if ((this.op & 0xf0) == 0) { 1011 last = this; 1012 for (;;) { 1013 this = state->distcode[last.val + 1014 (BITS(last.bits + last.op) >> last.bits)]; 1015 if ((unsigned)(last.bits + this.bits) <= bits) break; 1016 PULLBYTE(); 1017 } 1018 DROPBITS(last.bits); 1019 } 1020 DROPBITS(this.bits); 1021 if (this.op & 64) { 1022 strm->msg = __UNCONST("invalid distance code"); 1023 state->mode = BAD; 1024 break; 1025 } 1026 state->offset = (unsigned)this.val; 1027 state->extra = (unsigned)(this.op) & 15; 1028 state->mode = DISTEXT; 1029 case DISTEXT: 1030 if (state->extra) { 1031 NEEDBITS(state->extra); 1032 state->offset += BITS(state->extra); 1033 DROPBITS(state->extra); 1034 } 1035 #ifdef INFLATE_STRICT 1036 if (state->offset > state->dmax) { 1037 strm->msg = __UNCONST("invalid distance too far back"); 1038 state->mode = BAD; 1039 break; 1040 } 1041 #endif 1042 if (state->offset > state->whave + out - left) { 1043 strm->msg = __UNCONST("invalid distance too far back"); 1044 state->mode = BAD; 1045 break; 1046 } 1047 Tracevv((stderr, "inflate: distance %u\n", state->offset)); 1048 state->mode = MATCH; 1049 case MATCH: 1050 if (left == 0) goto inf_leave; 1051 copy = out - left; 1052 if (state->offset > copy) { /* copy from window */ 1053 copy = state->offset - copy; 1054 if (copy > state->write) { 1055 copy -= state->write; 1056 from = state->window + (state->wsize - copy); 1057 } 1058 else 1059 from = state->window + (state->write - copy); 1060 if (copy > state->length) copy = state->length; 1061 } 1062 else { /* copy from output */ 1063 from = put - state->offset; 1064 copy = state->length; 1065 } 1066 if (copy > left) copy = left; 1067 left -= copy; 1068 state->length -= copy; 1069 do { 1070 *put++ = *from++; 1071 } while (--copy); 1072 if (state->length == 0) state->mode = LEN; 1073 break; 1074 case LIT: 1075 if (left == 0) goto inf_leave; 1076 *put++ = (unsigned char)(state->length); 1077 left--; 1078 state->mode = LEN; 1079 break; 1080 case CHECK: 1081 if (state->wrap) { 1082 NEEDBITS(32); 1083 out -= left; 1084 strm->total_out += out; 1085 state->total += out; 1086 if (out) 1087 strm->adler = state->check = 1088 UPDATE(state->check, put - out, out); 1089 out = left; 1090 if (( 1091 #ifdef GUNZIP 1092 state->flags ? hold : 1093 #endif 1094 REVERSE(hold)) != state->check) { 1095 strm->msg = __UNCONST("incorrect data check"); 1096 state->mode = BAD; 1097 break; 1098 } 1099 INITBITS(); 1100 Tracev((stderr, "inflate: check matches trailer\n")); 1101 } 1102 #ifdef GUNZIP 1103 state->mode = LENGTH; 1104 case LENGTH: 1105 if (state->wrap && state->flags) { 1106 NEEDBITS(32); 1107 if (hold != (state->total & 0xffffffffUL)) { 1108 strm->msg = __UNCONST("incorrect length check"); 1109 state->mode = BAD; 1110 break; 1111 } 1112 INITBITS(); 1113 Tracev((stderr, "inflate: length matches trailer\n")); 1114 } 1115 #endif 1116 state->mode = DONE; 1117 case DONE: 1118 ret = Z_STREAM_END; 1119 goto inf_leave; 1120 case BAD: 1121 ret = Z_DATA_ERROR; 1122 goto inf_leave; 1123 case MEM: 1124 return Z_MEM_ERROR; 1125 case SYNC: 1126 default: 1127 return Z_STREAM_ERROR; 1128 } 1129 1130 /* 1131 Return from inflate(), updating the total counts and the check value. 1132 If there was no progress during the inflate() call, return a buffer 1133 error. Call updatewindow() to create and/or update the window state. 1134 Note: a memory error from inflate() is non-recoverable. 1135 */ 1136 inf_leave: 1137 RESTORE(); 1138 if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) 1139 if (updatewindow(strm, out)) { 1140 state->mode = MEM; 1141 return Z_MEM_ERROR; 1142 } 1143 in -= strm->avail_in; 1144 out -= strm->avail_out; 1145 strm->total_in += in; 1146 strm->total_out += out; 1147 state->total += out; 1148 if (state->wrap && out) 1149 strm->adler = state->check = 1150 UPDATE(state->check, strm->next_out - out, out); 1151 strm->data_type = state->bits + (state->last ? 64 : 0) + 1152 (state->mode == TYPE ? 128 : 0); 1153 if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) 1154 ret = Z_BUF_ERROR; 1155 return ret; 1156 } 1157 1158 int ZEXPORT inflateEnd(strm) 1159 z_streamp strm; 1160 { 1161 struct inflate_state FAR *state; 1162 if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) 1163 return Z_STREAM_ERROR; 1164 state = (struct inflate_state FAR *)strm->state; 1165 if (state->window != Z_NULL) ZFREE(strm, state->window); 1166 ZFREE(strm, strm->state); 1167 strm->state = Z_NULL; 1168 Tracev((stderr, "inflate: end\n")); 1169 return Z_OK; 1170 } 1171 1172 int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) 1173 z_streamp strm; 1174 const Bytef *dictionary; 1175 uInt dictLength; 1176 { 1177 struct inflate_state FAR *state; 1178 unsigned long id; 1179 1180 /* check state */ 1181 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 1182 state = (struct inflate_state FAR *)strm->state; 1183 if (state->wrap != 0 && state->mode != DICT) 1184 return Z_STREAM_ERROR; 1185 1186 /* check for correct dictionary id */ 1187 if (state->mode == DICT) { 1188 id = adler32(0L, Z_NULL, 0); 1189 id = adler32(id, dictionary, dictLength); 1190 if (id != state->check) 1191 return Z_DATA_ERROR; 1192 } 1193 1194 /* copy dictionary to window */ 1195 if (updatewindow(strm, strm->avail_out)) { 1196 state->mode = MEM; 1197 return Z_MEM_ERROR; 1198 } 1199 if (dictLength > state->wsize) { 1200 zmemcpy(state->window, dictionary + dictLength - state->wsize, 1201 state->wsize); 1202 state->whave = state->wsize; 1203 } 1204 else { 1205 zmemcpy(state->window + state->wsize - dictLength, dictionary, 1206 dictLength); 1207 state->whave = dictLength; 1208 } 1209 state->havedict = 1; 1210 Tracev((stderr, "inflate: dictionary set\n")); 1211 return Z_OK; 1212 } 1213 1214 int ZEXPORT inflateGetHeader(strm, head) 1215 z_streamp strm; 1216 gz_headerp head; 1217 { 1218 struct inflate_state FAR *state; 1219 1220 /* check state */ 1221 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 1222 state = (struct inflate_state FAR *)strm->state; 1223 if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; 1224 1225 /* save header structure */ 1226 state->head = head; 1227 head->done = 0; 1228 return Z_OK; 1229 } 1230 1231 /* 1232 Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found 1233 or when out of input. When called, *have is the number of pattern bytes 1234 found in order so far, in 0..3. On return *have is updated to the new 1235 state. If on return *have equals four, then the pattern was found and the 1236 return value is how many bytes were read including the last byte of the 1237 pattern. If *have is less than four, then the pattern has not been found 1238 yet and the return value is len. In the latter case, syncsearch() can be 1239 called again with more data and the *have state. *have is initialized to 1240 zero for the first call. 1241 */ 1242 local unsigned syncsearch(have, buf, len) 1243 unsigned FAR *have; 1244 unsigned char FAR *buf; 1245 unsigned len; 1246 { 1247 unsigned got; 1248 unsigned next; 1249 1250 got = *have; 1251 next = 0; 1252 while (next < len && got < 4) { 1253 if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) 1254 got++; 1255 else if (buf[next]) 1256 got = 0; 1257 else 1258 got = 4 - got; 1259 next++; 1260 } 1261 *have = got; 1262 return next; 1263 } 1264 1265 int ZEXPORT inflateSync(strm) 1266 z_streamp strm; 1267 { 1268 unsigned len; /* number of bytes to look at or looked at */ 1269 unsigned long in, out; /* temporary to save total_in and total_out */ 1270 unsigned char buf[4]; /* to restore bit buffer to byte string */ 1271 struct inflate_state FAR *state; 1272 1273 /* check parameters */ 1274 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 1275 state = (struct inflate_state FAR *)strm->state; 1276 if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; 1277 1278 /* if first time, start search in bit buffer */ 1279 if (state->mode != SYNC) { 1280 state->mode = SYNC; 1281 state->hold <<= state->bits & 7; 1282 state->bits -= state->bits & 7; 1283 len = 0; 1284 while (state->bits >= 8) { 1285 buf[len++] = (unsigned char)(state->hold); 1286 state->hold >>= 8; 1287 state->bits -= 8; 1288 } 1289 state->have = 0; 1290 syncsearch(&(state->have), buf, len); 1291 } 1292 1293 /* search available input */ 1294 len = syncsearch(&(state->have), strm->next_in, strm->avail_in); 1295 strm->avail_in -= len; 1296 strm->next_in += len; 1297 strm->total_in += len; 1298 1299 /* return no joy or set up to restart inflate() on a new block */ 1300 if (state->have != 4) return Z_DATA_ERROR; 1301 in = strm->total_in; out = strm->total_out; 1302 inflateReset(strm); 1303 strm->total_in = in; strm->total_out = out; 1304 state->mode = TYPE; 1305 return Z_OK; 1306 } 1307 1308 /* 1309 Returns true if inflate is currently at the end of a block generated by 1310 Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP 1311 implementation to provide an additional safety check. PPP uses 1312 Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored 1313 block. When decompressing, PPP checks that at the end of input packet, 1314 inflate is waiting for these length bytes. 1315 */ 1316 int ZEXPORT inflateSyncPoint(strm) 1317 z_streamp strm; 1318 { 1319 struct inflate_state FAR *state; 1320 1321 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 1322 state = (struct inflate_state FAR *)strm->state; 1323 return state->mode == STORED && state->bits == 0; 1324 } 1325 1326 int ZEXPORT inflateCopy(dest, source) 1327 z_streamp dest; 1328 z_streamp source; 1329 { 1330 struct inflate_state FAR *state; 1331 struct inflate_state FAR *copy; 1332 unsigned char FAR *window; 1333 unsigned wsize; 1334 1335 /* check input */ 1336 if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || 1337 source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) 1338 return Z_STREAM_ERROR; 1339 state = (struct inflate_state FAR *)source->state; 1340 1341 /* allocate space */ 1342 copy = (struct inflate_state FAR *) 1343 ZALLOC(source, 1, sizeof(struct inflate_state)); 1344 if (copy == Z_NULL) return Z_MEM_ERROR; 1345 window = Z_NULL; 1346 if (state->window != Z_NULL) { 1347 window = (unsigned char FAR *) 1348 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); 1349 if (window == Z_NULL) { 1350 ZFREE(source, copy); 1351 return Z_MEM_ERROR; 1352 } 1353 } 1354 1355 /* copy state */ 1356 zmemcpy(dest, source, sizeof(z_stream)); 1357 zmemcpy(copy, state, sizeof(struct inflate_state)); 1358 if (state->lencode >= state->codes && 1359 state->lencode <= state->codes + ENOUGH - 1) { 1360 copy->lencode = copy->codes + (state->lencode - state->codes); 1361 copy->distcode = copy->codes + (state->distcode - state->codes); 1362 } 1363 copy->next = copy->codes + (state->next - state->codes); 1364 if (window != Z_NULL) { 1365 wsize = 1U << state->wbits; 1366 zmemcpy(window, state->window, wsize); 1367 } 1368 copy->window = window; 1369 dest->state = (struct internal_state FAR *)copy; 1370 return Z_OK; 1371 } 1372