1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. Oracle designates this 7 * particular file as subject to the "Classpath" exception as provided 8 * by Oracle in the LICENSE file that accompanied this code. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 */ 24 25 /* infback.c -- inflate using a call-back interface 26 * Copyright (C) 1995-2011 Mark Adler 27 * For conditions of distribution and use, see copyright notice in zlib.h 28 */ 29 30 /* 31 This code is largely copied from inflate.c. Normally either infback.o or 32 inflate.o would be linked into an application--not both. The interface 33 with inffast.c is retained so that optimized assembler-coded versions of 34 inflate_fast() can be used with either inflate.c or infback.c. 35 */ 36 37 #include "zutil.h" 38 #include "inftrees.h" 39 #include "inflate.h" 40 #include "inffast.h" 41 42 /* function prototypes */ 43 local void fixedtables OF((struct inflate_state FAR *state)); 44 45 /* 46 strm provides memory allocation functions in zalloc and zfree, or 47 Z_NULL to use the library memory allocation functions. 48 49 windowBits is in the range 8..15, and window is a user-supplied 50 window and output buffer that is 2**windowBits bytes. 51 */ 52 int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) 53 z_streamp strm; 54 int windowBits; 55 unsigned char FAR *window; 56 const char *version; 57 int stream_size; 58 { 59 struct inflate_state FAR *state; 60 61 if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || 62 stream_size != (int)(sizeof(z_stream))) 63 return Z_VERSION_ERROR; 64 if (strm == Z_NULL || window == Z_NULL || 65 windowBits < 8 || windowBits > 15) 66 return Z_STREAM_ERROR; 67 strm->msg = Z_NULL; /* in case we return an error */ 68 if (strm->zalloc == (alloc_func)0) { 69 #ifdef Z_SOLO 70 return Z_STREAM_ERROR; 71 #else 72 strm->zalloc = zcalloc; 73 strm->opaque = (voidpf)0; 74 #endif 75 } 76 if (strm->zfree == (free_func)0) 77 #ifdef Z_SOLO 78 return Z_STREAM_ERROR; 79 #else 80 strm->zfree = zcfree; 81 #endif 82 state = (struct inflate_state FAR *)ZALLOC(strm, 1, 83 sizeof(struct inflate_state)); 84 if (state == Z_NULL) return Z_MEM_ERROR; 85 Tracev((stderr, "inflate: allocated\n")); 86 strm->state = (struct internal_state FAR *)state; 87 state->dmax = 32768U; 88 state->wbits = windowBits; 89 state->wsize = 1U << windowBits; 90 state->window = window; 91 state->wnext = 0; 92 state->whave = 0; 93 return Z_OK; 94 } 95 96 /* 97 Return state with length and distance decoding tables and index sizes set to 98 fixed code decoding. Normally this returns fixed tables from inffixed.h. 99 If BUILDFIXED is defined, then instead this routine builds the tables the 100 first time it's called, and returns those tables the first time and 101 thereafter. This reduces the size of the code by about 2K bytes, in 102 exchange for a little execution time. However, BUILDFIXED should not be 103 used for threaded applications, since the rewriting of the tables and virgin 104 may not be thread-safe. 105 */ 106 local void fixedtables(state) 107 struct inflate_state FAR *state; 108 { 109 #ifdef BUILDFIXED 110 static int virgin = 1; 111 static code *lenfix, *distfix; 112 static code fixed[544]; 113 114 /* build fixed huffman tables if first call (may not be thread safe) */ 115 if (virgin) { 116 unsigned sym, bits; 117 static code *next; 118 119 /* literal/length table */ 120 sym = 0; 121 while (sym < 144) state->lens[sym++] = 8; 122 while (sym < 256) state->lens[sym++] = 9; 123 while (sym < 280) state->lens[sym++] = 7; 124 while (sym < 288) state->lens[sym++] = 8; 125 next = fixed; 126 lenfix = next; 127 bits = 9; 128 inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); 129 130 /* distance table */ 131 sym = 0; 132 while (sym < 32) state->lens[sym++] = 5; 133 distfix = next; 134 bits = 5; 135 inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); 136 137 /* do this just once */ 138 virgin = 0; 139 } 140 #else /* !BUILDFIXED */ 141 # include "inffixed.h" 142 #endif /* BUILDFIXED */ 143 state->lencode = lenfix; 144 state->lenbits = 9; 145 state->distcode = distfix; 146 state->distbits = 5; 147 } 148 149 /* Macros for inflateBack(): */ 150 151 /* Load returned state from inflate_fast() */ 152 #define LOAD() \ 153 do { \ 154 put = strm->next_out; \ 155 left = strm->avail_out; \ 156 next = strm->next_in; \ 157 have = strm->avail_in; \ 158 hold = state->hold; \ 159 bits = state->bits; \ 160 } while (0) 161 162 /* Set state from registers for inflate_fast() */ 163 #define RESTORE() \ 164 do { \ 165 strm->next_out = put; \ 166 strm->avail_out = left; \ 167 strm->next_in = next; \ 168 strm->avail_in = have; \ 169 state->hold = hold; \ 170 state->bits = bits; \ 171 } while (0) 172 173 /* Clear the input bit accumulator */ 174 #define INITBITS() \ 175 do { \ 176 hold = 0; \ 177 bits = 0; \ 178 } while (0) 179 180 /* Assure that some input is available. If input is requested, but denied, 181 then return a Z_BUF_ERROR from inflateBack(). */ 182 #define PULL() \ 183 do { \ 184 if (have == 0) { \ 185 have = in(in_desc, &next); \ 186 if (have == 0) { \ 187 next = Z_NULL; \ 188 ret = Z_BUF_ERROR; \ 189 goto inf_leave; \ 190 } \ 191 } \ 192 } while (0) 193 194 /* Get a byte of input into the bit accumulator, or return from inflateBack() 195 with an error if there is no input available. */ 196 #define PULLBYTE() \ 197 do { \ 198 PULL(); \ 199 have--; \ 200 hold += (unsigned long)(*next++) << bits; \ 201 bits += 8; \ 202 } while (0) 203 204 /* Assure that there are at least n bits in the bit accumulator. If there is 205 not enough available input to do that, then return from inflateBack() with 206 an error. */ 207 #define NEEDBITS(n) \ 208 do { \ 209 while (bits < (unsigned)(n)) \ 210 PULLBYTE(); \ 211 } while (0) 212 213 /* Return the low n bits of the bit accumulator (n < 16) */ 214 #define BITS(n) \ 215 ((unsigned)hold & ((1U << (n)) - 1)) 216 217 /* Remove n bits from the bit accumulator */ 218 #define DROPBITS(n) \ 219 do { \ 220 hold >>= (n); \ 221 bits -= (unsigned)(n); \ 222 } while (0) 223 224 /* Remove zero to seven bits as needed to go to a byte boundary */ 225 #define BYTEBITS() \ 226 do { \ 227 hold >>= bits & 7; \ 228 bits -= bits & 7; \ 229 } while (0) 230 231 /* Assure that some output space is available, by writing out the window 232 if it's full. If the write fails, return from inflateBack() with a 233 Z_BUF_ERROR. */ 234 #define ROOM() \ 235 do { \ 236 if (left == 0) { \ 237 put = state->window; \ 238 left = state->wsize; \ 239 state->whave = left; \ 240 if (out(out_desc, put, left)) { \ 241 ret = Z_BUF_ERROR; \ 242 goto inf_leave; \ 243 } \ 244 } \ 245 } while (0) 246 247 /* 248 strm provides the memory allocation functions and window buffer on input, 249 and provides information on the unused input on return. For Z_DATA_ERROR 250 returns, strm will also provide an error message. 251 252 in() and out() are the call-back input and output functions. When 253 inflateBack() needs more input, it calls in(). When inflateBack() has 254 filled the window with output, or when it completes with data in the 255 window, it calls out() to write out the data. The application must not 256 change the provided input until in() is called again or inflateBack() 257 returns. The application must not change the window/output buffer until 258 inflateBack() returns. 259 260 in() and out() are called with a descriptor parameter provided in the 261 inflateBack() call. This parameter can be a structure that provides the 262 information required to do the read or write, as well as accumulated 263 information on the input and output such as totals and check values. 264 265 in() should return zero on failure. out() should return non-zero on 266 failure. If either in() or out() fails, than inflateBack() returns a 267 Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it 268 was in() or out() that caused in the error. Otherwise, inflateBack() 269 returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format 270 error, or Z_MEM_ERROR if it could not allocate memory for the state. 271 inflateBack() can also return Z_STREAM_ERROR if the input parameters 272 are not correct, i.e. strm is Z_NULL or the state was not initialized. 273 */ 274 int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) 275 z_streamp strm; 276 in_func in; 277 void FAR *in_desc; 278 out_func out; 279 void FAR *out_desc; 280 { 281 struct inflate_state FAR *state; 282 z_const unsigned char FAR *next; /* next input */ 283 unsigned char FAR *put; /* next output */ 284 unsigned have, left; /* available input and output */ 285 unsigned long hold; /* bit buffer */ 286 unsigned bits; /* bits in bit buffer */ 287 unsigned copy; /* number of stored or match bytes to copy */ 288 unsigned char FAR *from; /* where to copy match bytes from */ 289 code here; /* current decoding table entry */ 290 code last; /* parent table entry */ 291 unsigned len; /* length to copy for repeats, bits to drop */ 292 int ret; /* return code */ 293 static const unsigned short order[19] = /* permutation of code lengths */ 294 {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; 295 296 /* Check that the strm exists and that the state was initialized */ 297 if (strm == Z_NULL || strm->state == Z_NULL) 298 return Z_STREAM_ERROR; 299 state = (struct inflate_state FAR *)strm->state; 300 301 /* Reset the state */ 302 strm->msg = Z_NULL; 303 state->mode = TYPE; 304 state->last = 0; 305 state->whave = 0; 306 next = strm->next_in; 307 have = next != Z_NULL ? strm->avail_in : 0; 308 hold = 0; 309 bits = 0; 310 put = state->window; 311 left = state->wsize; 312 313 /* Inflate until end of block marked as last */ 314 for (;;) 315 switch (state->mode) { 316 case TYPE: 317 /* determine and dispatch block type */ 318 if (state->last) { 319 BYTEBITS(); 320 state->mode = DONE; 321 break; 322 } 323 NEEDBITS(3); 324 state->last = BITS(1); 325 DROPBITS(1); 326 switch (BITS(2)) { 327 case 0: /* stored block */ 328 Tracev((stderr, "inflate: stored block%s\n", 329 state->last ? " (last)" : "")); 330 state->mode = STORED; 331 break; 332 case 1: /* fixed block */ 333 fixedtables(state); 334 Tracev((stderr, "inflate: fixed codes block%s\n", 335 state->last ? " (last)" : "")); 336 state->mode = LEN; /* decode codes */ 337 break; 338 case 2: /* dynamic block */ 339 Tracev((stderr, "inflate: dynamic codes block%s\n", 340 state->last ? " (last)" : "")); 341 state->mode = TABLE; 342 break; 343 case 3: 344 strm->msg = (char *)"invalid block type"; 345 state->mode = BAD; 346 } 347 DROPBITS(2); 348 break; 349 350 case STORED: 351 /* get and verify stored block length */ 352 BYTEBITS(); /* go to byte boundary */ 353 NEEDBITS(32); 354 if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { 355 strm->msg = (char *)"invalid stored block lengths"; 356 state->mode = BAD; 357 break; 358 } 359 state->length = (unsigned)hold & 0xffff; 360 Tracev((stderr, "inflate: stored length %u\n", 361 state->length)); 362 INITBITS(); 363 364 /* copy stored block from input to output */ 365 while (state->length != 0) { 366 copy = state->length; 367 PULL(); 368 ROOM(); 369 if (copy > have) copy = have; 370 if (copy > left) copy = left; 371 zmemcpy(put, next, copy); 372 have -= copy; 373 next += copy; 374 left -= copy; 375 put += copy; 376 state->length -= copy; 377 } 378 Tracev((stderr, "inflate: stored end\n")); 379 state->mode = TYPE; 380 break; 381 382 case TABLE: 383 /* get dynamic table entries descriptor */ 384 NEEDBITS(14); 385 state->nlen = BITS(5) + 257; 386 DROPBITS(5); 387 state->ndist = BITS(5) + 1; 388 DROPBITS(5); 389 state->ncode = BITS(4) + 4; 390 DROPBITS(4); 391 #ifndef PKZIP_BUG_WORKAROUND 392 if (state->nlen > 286 || state->ndist > 30) { 393 strm->msg = (char *)"too many length or distance symbols"; 394 state->mode = BAD; 395 break; 396 } 397 #endif 398 Tracev((stderr, "inflate: table sizes ok\n")); 399 400 /* get code length code lengths (not a typo) */ 401 state->have = 0; 402 while (state->have < state->ncode) { 403 NEEDBITS(3); 404 state->lens[order[state->have++]] = (unsigned short)BITS(3); 405 DROPBITS(3); 406 } 407 while (state->have < 19) 408 state->lens[order[state->have++]] = 0; 409 state->next = state->codes; 410 state->lencode = (code const FAR *)(state->next); 411 state->lenbits = 7; 412 ret = inflate_table(CODES, state->lens, 19, &(state->next), 413 &(state->lenbits), state->work); 414 if (ret) { 415 strm->msg = (char *)"invalid code lengths set"; 416 state->mode = BAD; 417 break; 418 } 419 Tracev((stderr, "inflate: code lengths ok\n")); 420 421 /* get length and distance code code lengths */ 422 state->have = 0; 423 while (state->have < state->nlen + state->ndist) { 424 for (;;) { 425 here = state->lencode[BITS(state->lenbits)]; 426 if ((unsigned)(here.bits) <= bits) break; 427 PULLBYTE(); 428 } 429 if (here.val < 16) { 430 DROPBITS(here.bits); 431 state->lens[state->have++] = here.val; 432 } 433 else { 434 if (here.val == 16) { 435 NEEDBITS(here.bits + 2); 436 DROPBITS(here.bits); 437 if (state->have == 0) { 438 strm->msg = (char *)"invalid bit length repeat"; 439 state->mode = BAD; 440 break; 441 } 442 len = (unsigned)(state->lens[state->have - 1]); 443 copy = 3 + BITS(2); 444 DROPBITS(2); 445 } 446 else if (here.val == 17) { 447 NEEDBITS(here.bits + 3); 448 DROPBITS(here.bits); 449 len = 0; 450 copy = 3 + BITS(3); 451 DROPBITS(3); 452 } 453 else { 454 NEEDBITS(here.bits + 7); 455 DROPBITS(here.bits); 456 len = 0; 457 copy = 11 + BITS(7); 458 DROPBITS(7); 459 } 460 if (state->have + copy > state->nlen + state->ndist) { 461 strm->msg = (char *)"invalid bit length repeat"; 462 state->mode = BAD; 463 break; 464 } 465 while (copy--) 466 state->lens[state->have++] = (unsigned short)len; 467 } 468 } 469 470 /* handle error breaks in while */ 471 if (state->mode == BAD) break; 472 473 /* check for end-of-block code (better have one) */ 474 if (state->lens[256] == 0) { 475 strm->msg = (char *)"invalid code -- missing end-of-block"; 476 state->mode = BAD; 477 break; 478 } 479 480 /* build code tables -- note: do not change the lenbits or distbits 481 values here (9 and 6) without reading the comments in inftrees.h 482 concerning the ENOUGH constants, which depend on those values */ 483 state->next = state->codes; 484 state->lencode = (code const FAR *)(state->next); 485 state->lenbits = 9; 486 ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), 487 &(state->lenbits), state->work); 488 if (ret) { 489 strm->msg = (char *)"invalid literal/lengths set"; 490 state->mode = BAD; 491 break; 492 } 493 state->distcode = (code const FAR *)(state->next); 494 state->distbits = 6; 495 ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, 496 &(state->next), &(state->distbits), state->work); 497 if (ret) { 498 strm->msg = (char *)"invalid distances set"; 499 state->mode = BAD; 500 break; 501 } 502 Tracev((stderr, "inflate: codes ok\n")); 503 state->mode = LEN; 504 505 case LEN: 506 /* use inflate_fast() if we have enough input and output */ 507 if (have >= 6 && left >= 258) { 508 RESTORE(); 509 if (state->whave < state->wsize) 510 state->whave = state->wsize - left; 511 inflate_fast(strm, state->wsize); 512 LOAD(); 513 break; 514 } 515 516 /* get a literal, length, or end-of-block code */ 517 for (;;) { 518 here = state->lencode[BITS(state->lenbits)]; 519 if ((unsigned)(here.bits) <= bits) break; 520 PULLBYTE(); 521 } 522 if (here.op && (here.op & 0xf0) == 0) { 523 last = here; 524 for (;;) { 525 here = state->lencode[last.val + 526 (BITS(last.bits + last.op) >> last.bits)]; 527 if ((unsigned)(last.bits + here.bits) <= bits) break; 528 PULLBYTE(); 529 } 530 DROPBITS(last.bits); 531 } 532 DROPBITS(here.bits); 533 state->length = (unsigned)here.val; 534 535 /* process literal */ 536 if (here.op == 0) { 537 Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? 538 "inflate: literal '%c'\n" : 539 "inflate: literal 0x%02x\n", here.val)); 540 ROOM(); 541 *put++ = (unsigned char)(state->length); 542 left--; 543 state->mode = LEN; 544 break; 545 } 546 547 /* process end of block */ 548 if (here.op & 32) { 549 Tracevv((stderr, "inflate: end of block\n")); 550 state->mode = TYPE; 551 break; 552 } 553 554 /* invalid code */ 555 if (here.op & 64) { 556 strm->msg = (char *)"invalid literal/length code"; 557 state->mode = BAD; 558 break; 559 } 560 561 /* length code -- get extra bits, if any */ 562 state->extra = (unsigned)(here.op) & 15; 563 if (state->extra != 0) { 564 NEEDBITS(state->extra); 565 state->length += BITS(state->extra); 566 DROPBITS(state->extra); 567 } 568 Tracevv((stderr, "inflate: length %u\n", state->length)); 569 570 /* get distance code */ 571 for (;;) { 572 here = state->distcode[BITS(state->distbits)]; 573 if ((unsigned)(here.bits) <= bits) break; 574 PULLBYTE(); 575 } 576 if ((here.op & 0xf0) == 0) { 577 last = here; 578 for (;;) { 579 here = state->distcode[last.val + 580 (BITS(last.bits + last.op) >> last.bits)]; 581 if ((unsigned)(last.bits + here.bits) <= bits) break; 582 PULLBYTE(); 583 } 584 DROPBITS(last.bits); 585 } 586 DROPBITS(here.bits); 587 if (here.op & 64) { 588 strm->msg = (char *)"invalid distance code"; 589 state->mode = BAD; 590 break; 591 } 592 state->offset = (unsigned)here.val; 593 594 /* get distance extra bits, if any */ 595 state->extra = (unsigned)(here.op) & 15; 596 if (state->extra != 0) { 597 NEEDBITS(state->extra); 598 state->offset += BITS(state->extra); 599 DROPBITS(state->extra); 600 } 601 if (state->offset > state->wsize - (state->whave < state->wsize ? 602 left : 0)) { 603 strm->msg = (char *)"invalid distance too far back"; 604 state->mode = BAD; 605 break; 606 } 607 Tracevv((stderr, "inflate: distance %u\n", state->offset)); 608 609 /* copy match from window to output */ 610 do { 611 ROOM(); 612 copy = state->wsize - state->offset; 613 if (copy < left) { 614 from = put + copy; 615 copy = left - copy; 616 } 617 else { 618 from = put - state->offset; 619 copy = left; 620 } 621 if (copy > state->length) copy = state->length; 622 state->length -= copy; 623 left -= copy; 624 do { 625 *put++ = *from++; 626 } while (--copy); 627 } while (state->length != 0); 628 break; 629 630 case DONE: 631 /* inflate stream terminated properly -- write leftover output */ 632 ret = Z_STREAM_END; 633 if (left < state->wsize) { 634 if (out(out_desc, state->window, state->wsize - left)) 635 ret = Z_BUF_ERROR; 636 } 637 goto inf_leave; 638 639 case BAD: 640 ret = Z_DATA_ERROR; 641 goto inf_leave; 642 643 default: /* can't happen, but makes compilers happy */ 644 ret = Z_STREAM_ERROR; 645 goto inf_leave; 646 } 647 648 /* Return unused input */ 649 inf_leave: 650 strm->next_in = next; 651 strm->avail_in = have; 652 return ret; 653 } 654 655 int ZEXPORT inflateBackEnd(strm) 656 z_streamp strm; 657 { 658 if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) 659 return Z_STREAM_ERROR; 660 ZFREE(strm, strm->state); 661 strm->state = Z_NULL; 662 Tracev((stderr, "inflate: end\n")); 663 return Z_OK; 664 }