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