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