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