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