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