1*e89516f0SMike Frysinger /* inflate.c -- zlib decompression 2*e89516f0SMike Frysinger * Copyright (C) 1995-2005 Mark Adler 3*e89516f0SMike Frysinger * For conditions of distribution and use, see copyright notice in zlib.h 4*e89516f0SMike Frysinger */ 5*e89516f0SMike Frysinger local void fixedtables OF((struct inflate_state FAR *state)); 6*e89516f0SMike Frysinger local int updatewindow OF((z_streamp strm, unsigned out)); 7*e89516f0SMike Frysinger 8*e89516f0SMike Frysinger int ZEXPORT inflateReset(strm) 9*e89516f0SMike Frysinger z_streamp strm; 10*e89516f0SMike Frysinger { 11*e89516f0SMike Frysinger struct inflate_state FAR *state; 12*e89516f0SMike Frysinger 13*e89516f0SMike Frysinger if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 14*e89516f0SMike Frysinger state = (struct inflate_state FAR *)strm->state; 15*e89516f0SMike Frysinger strm->total_in = strm->total_out = state->total = 0; 16*e89516f0SMike Frysinger strm->msg = Z_NULL; 17*e89516f0SMike Frysinger strm->adler = 1; /* to support ill-conceived Java test suite */ 18*e89516f0SMike Frysinger state->mode = HEAD; 19*e89516f0SMike Frysinger state->last = 0; 20*e89516f0SMike Frysinger state->havedict = 0; 21*e89516f0SMike Frysinger state->dmax = 32768U; 22*e89516f0SMike Frysinger state->head = Z_NULL; 23*e89516f0SMike Frysinger state->wsize = 0; 24*e89516f0SMike Frysinger state->whave = 0; 25*e89516f0SMike Frysinger state->write = 0; 26*e89516f0SMike Frysinger state->hold = 0; 27*e89516f0SMike Frysinger state->bits = 0; 28*e89516f0SMike Frysinger state->lencode = state->distcode = state->next = state->codes; 29*e89516f0SMike Frysinger WATCHDOG_RESET(); 30*e89516f0SMike Frysinger Tracev((stderr, "inflate: reset\n")); 31*e89516f0SMike Frysinger return Z_OK; 32*e89516f0SMike Frysinger } 33*e89516f0SMike Frysinger 34*e89516f0SMike Frysinger int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) 35*e89516f0SMike Frysinger z_streamp strm; 36*e89516f0SMike Frysinger int windowBits; 37*e89516f0SMike Frysinger const char *version; 38*e89516f0SMike Frysinger int stream_size; 39*e89516f0SMike Frysinger { 40*e89516f0SMike Frysinger struct inflate_state FAR *state; 41*e89516f0SMike Frysinger 42*e89516f0SMike Frysinger if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || 43*e89516f0SMike Frysinger stream_size != (int)(sizeof(z_stream))) 44*e89516f0SMike Frysinger return Z_VERSION_ERROR; 45*e89516f0SMike Frysinger if (strm == Z_NULL) return Z_STREAM_ERROR; 46*e89516f0SMike Frysinger strm->msg = Z_NULL; /* in case we return an error */ 47*e89516f0SMike Frysinger if (strm->zalloc == (alloc_func)0) { 48*e89516f0SMike Frysinger strm->zalloc = zcalloc; 49*e89516f0SMike Frysinger strm->opaque = (voidpf)0; 50*e89516f0SMike Frysinger } 51*e89516f0SMike Frysinger if (strm->zfree == (free_func)0) strm->zfree = zcfree; 52*e89516f0SMike Frysinger state = (struct inflate_state FAR *) 53*e89516f0SMike Frysinger ZALLOC(strm, 1, sizeof(struct inflate_state)); 54*e89516f0SMike Frysinger if (state == Z_NULL) return Z_MEM_ERROR; 55*e89516f0SMike Frysinger Tracev((stderr, "inflate: allocated\n")); 56*e89516f0SMike Frysinger strm->state = (struct internal_state FAR *)state; 57*e89516f0SMike Frysinger if (windowBits < 0) { 58*e89516f0SMike Frysinger state->wrap = 0; 59*e89516f0SMike Frysinger windowBits = -windowBits; 60*e89516f0SMike Frysinger } 61*e89516f0SMike Frysinger else { 62*e89516f0SMike Frysinger state->wrap = (windowBits >> 4) + 1; 63*e89516f0SMike Frysinger #ifdef GUNZIP 64*e89516f0SMike Frysinger if (windowBits < 48) windowBits &= 15; 65*e89516f0SMike Frysinger #endif 66*e89516f0SMike Frysinger } 67*e89516f0SMike Frysinger if (windowBits < 8 || windowBits > 15) { 68*e89516f0SMike Frysinger ZFREE(strm, state); 69*e89516f0SMike Frysinger strm->state = Z_NULL; 70*e89516f0SMike Frysinger return Z_STREAM_ERROR; 71*e89516f0SMike Frysinger } 72*e89516f0SMike Frysinger state->wbits = (unsigned)windowBits; 73*e89516f0SMike Frysinger state->window = Z_NULL; 74*e89516f0SMike Frysinger return inflateReset(strm); 75*e89516f0SMike Frysinger } 76*e89516f0SMike Frysinger 77*e89516f0SMike Frysinger int ZEXPORT inflateInit_(strm, version, stream_size) 78*e89516f0SMike Frysinger z_streamp strm; 79*e89516f0SMike Frysinger const char *version; 80*e89516f0SMike Frysinger int stream_size; 81*e89516f0SMike Frysinger { 82*e89516f0SMike Frysinger return inflateInit2_(strm, DEF_WBITS, version, stream_size); 83*e89516f0SMike Frysinger } 84*e89516f0SMike Frysinger 85*e89516f0SMike Frysinger local void fixedtables(state) 86*e89516f0SMike Frysinger struct inflate_state FAR *state; 87*e89516f0SMike Frysinger { 88*e89516f0SMike Frysinger state->lencode = lenfix; 89*e89516f0SMike Frysinger state->lenbits = 9; 90*e89516f0SMike Frysinger state->distcode = distfix; 91*e89516f0SMike Frysinger state->distbits = 5; 92*e89516f0SMike Frysinger } 93*e89516f0SMike Frysinger 94*e89516f0SMike Frysinger /* 95*e89516f0SMike Frysinger Update the window with the last wsize (normally 32K) bytes written before 96*e89516f0SMike Frysinger returning. If window does not exist yet, create it. This is only called 97*e89516f0SMike Frysinger when a window is already in use, or when output has been written during this 98*e89516f0SMike Frysinger inflate call, but the end of the deflate stream has not been reached yet. 99*e89516f0SMike Frysinger It is also called to create a window for dictionary data when a dictionary 100*e89516f0SMike Frysinger is loaded. 101*e89516f0SMike Frysinger 102*e89516f0SMike Frysinger Providing output buffers larger than 32K to inflate() should provide a speed 103*e89516f0SMike Frysinger advantage, since only the last 32K of output is copied to the sliding window 104*e89516f0SMike Frysinger upon return from inflate(), and since all distances after the first 32K of 105*e89516f0SMike Frysinger output will fall in the output data, making match copies simpler and faster. 106*e89516f0SMike Frysinger The advantage may be dependent on the size of the processor's data caches. 107*e89516f0SMike Frysinger */ 108*e89516f0SMike Frysinger local int updatewindow(strm, out) 109*e89516f0SMike Frysinger z_streamp strm; 110*e89516f0SMike Frysinger unsigned out; 111*e89516f0SMike Frysinger { 112*e89516f0SMike Frysinger struct inflate_state FAR *state; 113*e89516f0SMike Frysinger unsigned copy, dist; 114*e89516f0SMike Frysinger 115*e89516f0SMike Frysinger state = (struct inflate_state FAR *)strm->state; 116*e89516f0SMike Frysinger 117*e89516f0SMike Frysinger /* if it hasn't been done already, allocate space for the window */ 118*e89516f0SMike Frysinger if (state->window == Z_NULL) { 119*e89516f0SMike Frysinger state->window = (unsigned char FAR *) 120*e89516f0SMike Frysinger ZALLOC(strm, 1U << state->wbits, 121*e89516f0SMike Frysinger sizeof(unsigned char)); 122*e89516f0SMike Frysinger if (state->window == Z_NULL) return 1; 123*e89516f0SMike Frysinger } 124*e89516f0SMike Frysinger 125*e89516f0SMike Frysinger /* if window not in use yet, initialize */ 126*e89516f0SMike Frysinger if (state->wsize == 0) { 127*e89516f0SMike Frysinger state->wsize = 1U << state->wbits; 128*e89516f0SMike Frysinger state->write = 0; 129*e89516f0SMike Frysinger state->whave = 0; 130*e89516f0SMike Frysinger } 131*e89516f0SMike Frysinger 132*e89516f0SMike Frysinger /* copy state->wsize or less output bytes into the circular window */ 133*e89516f0SMike Frysinger copy = out - strm->avail_out; 134*e89516f0SMike Frysinger if (copy >= state->wsize) { 135*e89516f0SMike Frysinger zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); 136*e89516f0SMike Frysinger state->write = 0; 137*e89516f0SMike Frysinger state->whave = state->wsize; 138*e89516f0SMike Frysinger } 139*e89516f0SMike Frysinger else { 140*e89516f0SMike Frysinger dist = state->wsize - state->write; 141*e89516f0SMike Frysinger if (dist > copy) dist = copy; 142*e89516f0SMike Frysinger zmemcpy(state->window + state->write, strm->next_out - copy, dist); 143*e89516f0SMike Frysinger copy -= dist; 144*e89516f0SMike Frysinger if (copy) { 145*e89516f0SMike Frysinger zmemcpy(state->window, strm->next_out - copy, copy); 146*e89516f0SMike Frysinger state->write = copy; 147*e89516f0SMike Frysinger state->whave = state->wsize; 148*e89516f0SMike Frysinger } 149*e89516f0SMike Frysinger else { 150*e89516f0SMike Frysinger state->write += dist; 151*e89516f0SMike Frysinger if (state->write == state->wsize) state->write = 0; 152*e89516f0SMike Frysinger if (state->whave < state->wsize) state->whave += dist; 153*e89516f0SMike Frysinger } 154*e89516f0SMike Frysinger } 155*e89516f0SMike Frysinger return 0; 156*e89516f0SMike Frysinger } 157*e89516f0SMike Frysinger 158*e89516f0SMike Frysinger /* Macros for inflate(): */ 159*e89516f0SMike Frysinger 160*e89516f0SMike Frysinger /* check function to use adler32() for zlib or crc32() for gzip */ 161*e89516f0SMike Frysinger #ifdef GUNZIP 162*e89516f0SMike Frysinger # define UPDATE(check, buf, len) \ 163*e89516f0SMike Frysinger (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) 164*e89516f0SMike Frysinger #else 165*e89516f0SMike Frysinger # define UPDATE(check, buf, len) adler32(check, buf, len) 166*e89516f0SMike Frysinger #endif 167*e89516f0SMike Frysinger 168*e89516f0SMike Frysinger /* check macros for header crc */ 169*e89516f0SMike Frysinger #ifdef GUNZIP 170*e89516f0SMike Frysinger # define CRC2(check, word) \ 171*e89516f0SMike Frysinger do { \ 172*e89516f0SMike Frysinger hbuf[0] = (unsigned char)(word); \ 173*e89516f0SMike Frysinger hbuf[1] = (unsigned char)((word) >> 8); \ 174*e89516f0SMike Frysinger check = crc32(check, hbuf, 2); \ 175*e89516f0SMike Frysinger } while (0) 176*e89516f0SMike Frysinger 177*e89516f0SMike Frysinger # define CRC4(check, word) \ 178*e89516f0SMike Frysinger do { \ 179*e89516f0SMike Frysinger hbuf[0] = (unsigned char)(word); \ 180*e89516f0SMike Frysinger hbuf[1] = (unsigned char)((word) >> 8); \ 181*e89516f0SMike Frysinger hbuf[2] = (unsigned char)((word) >> 16); \ 182*e89516f0SMike Frysinger hbuf[3] = (unsigned char)((word) >> 24); \ 183*e89516f0SMike Frysinger check = crc32(check, hbuf, 4); \ 184*e89516f0SMike Frysinger } while (0) 185*e89516f0SMike Frysinger #endif 186*e89516f0SMike Frysinger 187*e89516f0SMike Frysinger /* Load registers with state in inflate() for speed */ 188*e89516f0SMike Frysinger #define LOAD() \ 189*e89516f0SMike Frysinger do { \ 190*e89516f0SMike Frysinger put = strm->next_out; \ 191*e89516f0SMike Frysinger left = strm->avail_out; \ 192*e89516f0SMike Frysinger next = strm->next_in; \ 193*e89516f0SMike Frysinger have = strm->avail_in; \ 194*e89516f0SMike Frysinger hold = state->hold; \ 195*e89516f0SMike Frysinger bits = state->bits; \ 196*e89516f0SMike Frysinger } while (0) 197*e89516f0SMike Frysinger 198*e89516f0SMike Frysinger /* Restore state from registers in inflate() */ 199*e89516f0SMike Frysinger #define RESTORE() \ 200*e89516f0SMike Frysinger do { \ 201*e89516f0SMike Frysinger strm->next_out = put; \ 202*e89516f0SMike Frysinger strm->avail_out = left; \ 203*e89516f0SMike Frysinger strm->next_in = next; \ 204*e89516f0SMike Frysinger strm->avail_in = have; \ 205*e89516f0SMike Frysinger state->hold = hold; \ 206*e89516f0SMike Frysinger state->bits = bits; \ 207*e89516f0SMike Frysinger } while (0) 208*e89516f0SMike Frysinger 209*e89516f0SMike Frysinger /* Clear the input bit accumulator */ 210*e89516f0SMike Frysinger #define INITBITS() \ 211*e89516f0SMike Frysinger do { \ 212*e89516f0SMike Frysinger hold = 0; \ 213*e89516f0SMike Frysinger bits = 0; \ 214*e89516f0SMike Frysinger } while (0) 215*e89516f0SMike Frysinger 216*e89516f0SMike Frysinger /* Get a byte of input into the bit accumulator, or return from inflate() 217*e89516f0SMike Frysinger if there is no input available. */ 218*e89516f0SMike Frysinger #define PULLBYTE() \ 219*e89516f0SMike Frysinger do { \ 220*e89516f0SMike Frysinger if (have == 0) goto inf_leave; \ 221*e89516f0SMike Frysinger have--; \ 222*e89516f0SMike Frysinger hold += (unsigned long)(*next++) << bits; \ 223*e89516f0SMike Frysinger bits += 8; \ 224*e89516f0SMike Frysinger } while (0) 225*e89516f0SMike Frysinger 226*e89516f0SMike Frysinger /* Assure that there are at least n bits in the bit accumulator. If there is 227*e89516f0SMike Frysinger not enough available input to do that, then return from inflate(). */ 228*e89516f0SMike Frysinger #define NEEDBITS(n) \ 229*e89516f0SMike Frysinger do { \ 230*e89516f0SMike Frysinger while (bits < (unsigned)(n)) \ 231*e89516f0SMike Frysinger PULLBYTE(); \ 232*e89516f0SMike Frysinger } while (0) 233*e89516f0SMike Frysinger 234*e89516f0SMike Frysinger /* Return the low n bits of the bit accumulator (n < 16) */ 235*e89516f0SMike Frysinger #define BITS(n) \ 236*e89516f0SMike Frysinger ((unsigned)hold & ((1U << (n)) - 1)) 237*e89516f0SMike Frysinger 238*e89516f0SMike Frysinger /* Remove n bits from the bit accumulator */ 239*e89516f0SMike Frysinger #define DROPBITS(n) \ 240*e89516f0SMike Frysinger do { \ 241*e89516f0SMike Frysinger hold >>= (n); \ 242*e89516f0SMike Frysinger bits -= (unsigned)(n); \ 243*e89516f0SMike Frysinger } while (0) 244*e89516f0SMike Frysinger 245*e89516f0SMike Frysinger /* Remove zero to seven bits as needed to go to a byte boundary */ 246*e89516f0SMike Frysinger #define BYTEBITS() \ 247*e89516f0SMike Frysinger do { \ 248*e89516f0SMike Frysinger hold >>= bits & 7; \ 249*e89516f0SMike Frysinger bits -= bits & 7; \ 250*e89516f0SMike Frysinger } while (0) 251*e89516f0SMike Frysinger 252*e89516f0SMike Frysinger /* Reverse the bytes in a 32-bit value */ 253*e89516f0SMike Frysinger #define REVERSE(q) \ 254*e89516f0SMike Frysinger ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ 255*e89516f0SMike Frysinger (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) 256*e89516f0SMike Frysinger 257*e89516f0SMike Frysinger /* 258*e89516f0SMike Frysinger inflate() uses a state machine to process as much input data and generate as 259*e89516f0SMike Frysinger much output data as possible before returning. The state machine is 260*e89516f0SMike Frysinger structured roughly as follows: 261*e89516f0SMike Frysinger 262*e89516f0SMike Frysinger for (;;) switch (state) { 263*e89516f0SMike Frysinger ... 264*e89516f0SMike Frysinger case STATEn: 265*e89516f0SMike Frysinger if (not enough input data or output space to make progress) 266*e89516f0SMike Frysinger return; 267*e89516f0SMike Frysinger ... make progress ... 268*e89516f0SMike Frysinger state = STATEm; 269*e89516f0SMike Frysinger break; 270*e89516f0SMike Frysinger ... 271*e89516f0SMike Frysinger } 272*e89516f0SMike Frysinger 273*e89516f0SMike Frysinger so when inflate() is called again, the same case is attempted again, and 274*e89516f0SMike Frysinger if the appropriate resources are provided, the machine proceeds to the 275*e89516f0SMike Frysinger next state. The NEEDBITS() macro is usually the way the state evaluates 276*e89516f0SMike Frysinger whether it can proceed or should return. NEEDBITS() does the return if 277*e89516f0SMike Frysinger the requested bits are not available. The typical use of the BITS macros 278*e89516f0SMike Frysinger is: 279*e89516f0SMike Frysinger 280*e89516f0SMike Frysinger NEEDBITS(n); 281*e89516f0SMike Frysinger ... do something with BITS(n) ... 282*e89516f0SMike Frysinger DROPBITS(n); 283*e89516f0SMike Frysinger 284*e89516f0SMike Frysinger where NEEDBITS(n) either returns from inflate() if there isn't enough 285*e89516f0SMike Frysinger input left to load n bits into the accumulator, or it continues. BITS(n) 286*e89516f0SMike Frysinger gives the low n bits in the accumulator. When done, DROPBITS(n) drops 287*e89516f0SMike Frysinger the low n bits off the accumulator. INITBITS() clears the accumulator 288*e89516f0SMike Frysinger and sets the number of available bits to zero. BYTEBITS() discards just 289*e89516f0SMike Frysinger enough bits to put the accumulator on a byte boundary. After BYTEBITS() 290*e89516f0SMike Frysinger and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. 291*e89516f0SMike Frysinger 292*e89516f0SMike Frysinger NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return 293*e89516f0SMike Frysinger if there is no input available. The decoding of variable length codes uses 294*e89516f0SMike Frysinger PULLBYTE() directly in order to pull just enough bytes to decode the next 295*e89516f0SMike Frysinger code, and no more. 296*e89516f0SMike Frysinger 297*e89516f0SMike Frysinger Some states loop until they get enough input, making sure that enough 298*e89516f0SMike Frysinger state information is maintained to continue the loop where it left off 299*e89516f0SMike Frysinger if NEEDBITS() returns in the loop. For example, want, need, and keep 300*e89516f0SMike Frysinger would all have to actually be part of the saved state in case NEEDBITS() 301*e89516f0SMike Frysinger returns: 302*e89516f0SMike Frysinger 303*e89516f0SMike Frysinger case STATEw: 304*e89516f0SMike Frysinger while (want < need) { 305*e89516f0SMike Frysinger NEEDBITS(n); 306*e89516f0SMike Frysinger keep[want++] = BITS(n); 307*e89516f0SMike Frysinger DROPBITS(n); 308*e89516f0SMike Frysinger } 309*e89516f0SMike Frysinger state = STATEx; 310*e89516f0SMike Frysinger case STATEx: 311*e89516f0SMike Frysinger 312*e89516f0SMike Frysinger As shown above, if the next state is also the next case, then the break 313*e89516f0SMike Frysinger is omitted. 314*e89516f0SMike Frysinger 315*e89516f0SMike Frysinger A state may also return if there is not enough output space available to 316*e89516f0SMike Frysinger complete that state. Those states are copying stored data, writing a 317*e89516f0SMike Frysinger literal byte, and copying a matching string. 318*e89516f0SMike Frysinger 319*e89516f0SMike Frysinger When returning, a "goto inf_leave" is used to update the total counters, 320*e89516f0SMike Frysinger update the check value, and determine whether any progress has been made 321*e89516f0SMike Frysinger during that inflate() call in order to return the proper return code. 322*e89516f0SMike Frysinger Progress is defined as a change in either strm->avail_in or strm->avail_out. 323*e89516f0SMike Frysinger When there is a window, goto inf_leave will update the window with the last 324*e89516f0SMike Frysinger output written. If a goto inf_leave occurs in the middle of decompression 325*e89516f0SMike Frysinger and there is no window currently, goto inf_leave will create one and copy 326*e89516f0SMike Frysinger output to the window for the next call of inflate(). 327*e89516f0SMike Frysinger 328*e89516f0SMike Frysinger In this implementation, the flush parameter of inflate() only affects the 329*e89516f0SMike Frysinger return code (per zlib.h). inflate() always writes as much as possible to 330*e89516f0SMike Frysinger strm->next_out, given the space available and the provided input--the effect 331*e89516f0SMike Frysinger documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers 332*e89516f0SMike Frysinger the allocation of and copying into a sliding window until necessary, which 333*e89516f0SMike Frysinger provides the effect documented in zlib.h for Z_FINISH when the entire input 334*e89516f0SMike Frysinger stream available. So the only thing the flush parameter actually does is: 335*e89516f0SMike Frysinger when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it 336*e89516f0SMike Frysinger will return Z_BUF_ERROR if it has not reached the end of the stream. 337*e89516f0SMike Frysinger */ 338*e89516f0SMike Frysinger int ZEXPORT inflate(strm, flush) 339*e89516f0SMike Frysinger z_streamp strm; 340*e89516f0SMike Frysinger int flush; 341*e89516f0SMike Frysinger { 342*e89516f0SMike Frysinger struct inflate_state FAR *state; 343*e89516f0SMike Frysinger unsigned char FAR *next; /* next input */ 344*e89516f0SMike Frysinger unsigned char FAR *put; /* next output */ 345*e89516f0SMike Frysinger unsigned have, left; /* available input and output */ 346*e89516f0SMike Frysinger unsigned long hold; /* bit buffer */ 347*e89516f0SMike Frysinger unsigned bits; /* bits in bit buffer */ 348*e89516f0SMike Frysinger unsigned in, out; /* save starting available input and output */ 349*e89516f0SMike Frysinger unsigned copy; /* number of stored or match bytes to copy */ 350*e89516f0SMike Frysinger unsigned char FAR *from; /* where to copy match bytes from */ 351*e89516f0SMike Frysinger code this; /* current decoding table entry */ 352*e89516f0SMike Frysinger code last; /* parent table entry */ 353*e89516f0SMike Frysinger unsigned len; /* length to copy for repeats, bits to drop */ 354*e89516f0SMike Frysinger int ret; /* return code */ 355*e89516f0SMike Frysinger #ifdef GUNZIP 356*e89516f0SMike Frysinger unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ 357*e89516f0SMike Frysinger #endif 358*e89516f0SMike Frysinger static const unsigned short order[19] = /* permutation of code lengths */ 359*e89516f0SMike Frysinger {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; 360*e89516f0SMike Frysinger 361*e89516f0SMike Frysinger if (strm == Z_NULL || strm->state == Z_NULL || 362*e89516f0SMike Frysinger (strm->next_in == Z_NULL && strm->avail_in != 0)) 363*e89516f0SMike Frysinger return Z_STREAM_ERROR; 364*e89516f0SMike Frysinger 365*e89516f0SMike Frysinger state = (struct inflate_state FAR *)strm->state; 366*e89516f0SMike Frysinger if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ 367*e89516f0SMike Frysinger LOAD(); 368*e89516f0SMike Frysinger in = have; 369*e89516f0SMike Frysinger out = left; 370*e89516f0SMike Frysinger ret = Z_OK; 371*e89516f0SMike Frysinger for (;;) 372*e89516f0SMike Frysinger switch (state->mode) { 373*e89516f0SMike Frysinger case HEAD: 374*e89516f0SMike Frysinger if (state->wrap == 0) { 375*e89516f0SMike Frysinger state->mode = TYPEDO; 376*e89516f0SMike Frysinger break; 377*e89516f0SMike Frysinger } 378*e89516f0SMike Frysinger NEEDBITS(16); 379*e89516f0SMike Frysinger #ifdef GUNZIP 380*e89516f0SMike Frysinger if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ 381*e89516f0SMike Frysinger state->check = crc32(0L, Z_NULL, 0); 382*e89516f0SMike Frysinger CRC2(state->check, hold); 383*e89516f0SMike Frysinger INITBITS(); 384*e89516f0SMike Frysinger state->mode = FLAGS; 385*e89516f0SMike Frysinger break; 386*e89516f0SMike Frysinger } 387*e89516f0SMike Frysinger state->flags = 0; /* expect zlib header */ 388*e89516f0SMike Frysinger if (state->head != Z_NULL) 389*e89516f0SMike Frysinger state->head->done = -1; 390*e89516f0SMike Frysinger if (!(state->wrap & 1) || /* check if zlib header allowed */ 391*e89516f0SMike Frysinger #else 392*e89516f0SMike Frysinger if ( 393*e89516f0SMike Frysinger #endif 394*e89516f0SMike Frysinger ((BITS(8) << 8) + (hold >> 8)) % 31) { 395*e89516f0SMike Frysinger strm->msg = (char *)"incorrect header check"; 396*e89516f0SMike Frysinger state->mode = BAD; 397*e89516f0SMike Frysinger break; 398*e89516f0SMike Frysinger } 399*e89516f0SMike Frysinger if (BITS(4) != Z_DEFLATED) { 400*e89516f0SMike Frysinger strm->msg = (char *)"unknown compression method"; 401*e89516f0SMike Frysinger state->mode = BAD; 402*e89516f0SMike Frysinger break; 403*e89516f0SMike Frysinger } 404*e89516f0SMike Frysinger DROPBITS(4); 405*e89516f0SMike Frysinger len = BITS(4) + 8; 406*e89516f0SMike Frysinger if (len > state->wbits) { 407*e89516f0SMike Frysinger strm->msg = (char *)"invalid window size"; 408*e89516f0SMike Frysinger state->mode = BAD; 409*e89516f0SMike Frysinger break; 410*e89516f0SMike Frysinger } 411*e89516f0SMike Frysinger state->dmax = 1U << len; 412*e89516f0SMike Frysinger Tracev((stderr, "inflate: zlib header ok\n")); 413*e89516f0SMike Frysinger strm->adler = state->check = adler32(0L, Z_NULL, 0); 414*e89516f0SMike Frysinger state->mode = hold & 0x200 ? DICTID : TYPE; 415*e89516f0SMike Frysinger INITBITS(); 416*e89516f0SMike Frysinger break; 417*e89516f0SMike Frysinger #ifdef GUNZIP 418*e89516f0SMike Frysinger case FLAGS: 419*e89516f0SMike Frysinger NEEDBITS(16); 420*e89516f0SMike Frysinger state->flags = (int)(hold); 421*e89516f0SMike Frysinger if ((state->flags & 0xff) != Z_DEFLATED) { 422*e89516f0SMike Frysinger strm->msg = (char *)"unknown compression method"; 423*e89516f0SMike Frysinger state->mode = BAD; 424*e89516f0SMike Frysinger break; 425*e89516f0SMike Frysinger } 426*e89516f0SMike Frysinger if (state->flags & 0xe000) { 427*e89516f0SMike Frysinger strm->msg = (char *)"unknown header flags set"; 428*e89516f0SMike Frysinger state->mode = BAD; 429*e89516f0SMike Frysinger break; 430*e89516f0SMike Frysinger } 431*e89516f0SMike Frysinger if (state->head != Z_NULL) 432*e89516f0SMike Frysinger state->head->text = (int)((hold >> 8) & 1); 433*e89516f0SMike Frysinger if (state->flags & 0x0200) CRC2(state->check, hold); 434*e89516f0SMike Frysinger INITBITS(); 435*e89516f0SMike Frysinger state->mode = TIME; 436*e89516f0SMike Frysinger case TIME: 437*e89516f0SMike Frysinger NEEDBITS(32); 438*e89516f0SMike Frysinger if (state->head != Z_NULL) 439*e89516f0SMike Frysinger state->head->time = hold; 440*e89516f0SMike Frysinger if (state->flags & 0x0200) CRC4(state->check, hold); 441*e89516f0SMike Frysinger INITBITS(); 442*e89516f0SMike Frysinger state->mode = OS; 443*e89516f0SMike Frysinger case OS: 444*e89516f0SMike Frysinger NEEDBITS(16); 445*e89516f0SMike Frysinger if (state->head != Z_NULL) { 446*e89516f0SMike Frysinger state->head->xflags = (int)(hold & 0xff); 447*e89516f0SMike Frysinger state->head->os = (int)(hold >> 8); 448*e89516f0SMike Frysinger } 449*e89516f0SMike Frysinger if (state->flags & 0x0200) CRC2(state->check, hold); 450*e89516f0SMike Frysinger INITBITS(); 451*e89516f0SMike Frysinger state->mode = EXLEN; 452*e89516f0SMike Frysinger case EXLEN: 453*e89516f0SMike Frysinger if (state->flags & 0x0400) { 454*e89516f0SMike Frysinger NEEDBITS(16); 455*e89516f0SMike Frysinger state->length = (unsigned)(hold); 456*e89516f0SMike Frysinger if (state->head != Z_NULL) 457*e89516f0SMike Frysinger state->head->extra_len = (unsigned)hold; 458*e89516f0SMike Frysinger if (state->flags & 0x0200) CRC2(state->check, hold); 459*e89516f0SMike Frysinger INITBITS(); 460*e89516f0SMike Frysinger } 461*e89516f0SMike Frysinger else if (state->head != Z_NULL) 462*e89516f0SMike Frysinger state->head->extra = Z_NULL; 463*e89516f0SMike Frysinger state->mode = EXTRA; 464*e89516f0SMike Frysinger case EXTRA: 465*e89516f0SMike Frysinger if (state->flags & 0x0400) { 466*e89516f0SMike Frysinger copy = state->length; 467*e89516f0SMike Frysinger if (copy > have) copy = have; 468*e89516f0SMike Frysinger if (copy) { 469*e89516f0SMike Frysinger if (state->head != Z_NULL && 470*e89516f0SMike Frysinger state->head->extra != Z_NULL) { 471*e89516f0SMike Frysinger len = state->head->extra_len - state->length; 472*e89516f0SMike Frysinger zmemcpy(state->head->extra + len, next, 473*e89516f0SMike Frysinger len + copy > state->head->extra_max ? 474*e89516f0SMike Frysinger state->head->extra_max - len : copy); 475*e89516f0SMike Frysinger } 476*e89516f0SMike Frysinger if (state->flags & 0x0200) 477*e89516f0SMike Frysinger state->check = crc32(state->check, next, copy); 478*e89516f0SMike Frysinger have -= copy; 479*e89516f0SMike Frysinger next += copy; 480*e89516f0SMike Frysinger state->length -= copy; 481*e89516f0SMike Frysinger } 482*e89516f0SMike Frysinger if (state->length) goto inf_leave; 483*e89516f0SMike Frysinger } 484*e89516f0SMike Frysinger state->length = 0; 485*e89516f0SMike Frysinger state->mode = NAME; 486*e89516f0SMike Frysinger case NAME: 487*e89516f0SMike Frysinger if (state->flags & 0x0800) { 488*e89516f0SMike Frysinger if (have == 0) goto inf_leave; 489*e89516f0SMike Frysinger copy = 0; 490*e89516f0SMike Frysinger do { 491*e89516f0SMike Frysinger len = (unsigned)(next[copy++]); 492*e89516f0SMike Frysinger if (state->head != Z_NULL && 493*e89516f0SMike Frysinger state->head->name != Z_NULL && 494*e89516f0SMike Frysinger state->length < state->head->name_max) 495*e89516f0SMike Frysinger state->head->name[state->length++] = len; 496*e89516f0SMike Frysinger } while (len && copy < have); 497*e89516f0SMike Frysinger if (state->flags & 0x0200) 498*e89516f0SMike Frysinger state->check = crc32(state->check, next, copy); 499*e89516f0SMike Frysinger have -= copy; 500*e89516f0SMike Frysinger next += copy; 501*e89516f0SMike Frysinger if (len) goto inf_leave; 502*e89516f0SMike Frysinger } 503*e89516f0SMike Frysinger else if (state->head != Z_NULL) 504*e89516f0SMike Frysinger state->head->name = Z_NULL; 505*e89516f0SMike Frysinger state->length = 0; 506*e89516f0SMike Frysinger state->mode = COMMENT; 507*e89516f0SMike Frysinger case COMMENT: 508*e89516f0SMike Frysinger if (state->flags & 0x1000) { 509*e89516f0SMike Frysinger if (have == 0) goto inf_leave; 510*e89516f0SMike Frysinger copy = 0; 511*e89516f0SMike Frysinger do { 512*e89516f0SMike Frysinger len = (unsigned)(next[copy++]); 513*e89516f0SMike Frysinger if (state->head != Z_NULL && 514*e89516f0SMike Frysinger state->head->comment != Z_NULL && 515*e89516f0SMike Frysinger state->length < state->head->comm_max) 516*e89516f0SMike Frysinger state->head->comment[state->length++] = len; 517*e89516f0SMike Frysinger } while (len && copy < have); 518*e89516f0SMike Frysinger if (state->flags & 0x0200) 519*e89516f0SMike Frysinger state->check = crc32(state->check, next, copy); 520*e89516f0SMike Frysinger have -= copy; 521*e89516f0SMike Frysinger next += copy; 522*e89516f0SMike Frysinger if (len) goto inf_leave; 523*e89516f0SMike Frysinger } 524*e89516f0SMike Frysinger else if (state->head != Z_NULL) 525*e89516f0SMike Frysinger state->head->comment = Z_NULL; 526*e89516f0SMike Frysinger state->mode = HCRC; 527*e89516f0SMike Frysinger case HCRC: 528*e89516f0SMike Frysinger if (state->flags & 0x0200) { 529*e89516f0SMike Frysinger NEEDBITS(16); 530*e89516f0SMike Frysinger if (hold != (state->check & 0xffff)) { 531*e89516f0SMike Frysinger strm->msg = (char *)"header crc mismatch"; 532*e89516f0SMike Frysinger state->mode = BAD; 533*e89516f0SMike Frysinger break; 534*e89516f0SMike Frysinger } 535*e89516f0SMike Frysinger INITBITS(); 536*e89516f0SMike Frysinger } 537*e89516f0SMike Frysinger if (state->head != Z_NULL) { 538*e89516f0SMike Frysinger state->head->hcrc = (int)((state->flags >> 9) & 1); 539*e89516f0SMike Frysinger state->head->done = 1; 540*e89516f0SMike Frysinger } 541*e89516f0SMike Frysinger strm->adler = state->check = crc32(0L, Z_NULL, 0); 542*e89516f0SMike Frysinger state->mode = TYPE; 543*e89516f0SMike Frysinger break; 544*e89516f0SMike Frysinger #endif 545*e89516f0SMike Frysinger case DICTID: 546*e89516f0SMike Frysinger NEEDBITS(32); 547*e89516f0SMike Frysinger strm->adler = state->check = REVERSE(hold); 548*e89516f0SMike Frysinger INITBITS(); 549*e89516f0SMike Frysinger state->mode = DICT; 550*e89516f0SMike Frysinger case DICT: 551*e89516f0SMike Frysinger if (state->havedict == 0) { 552*e89516f0SMike Frysinger RESTORE(); 553*e89516f0SMike Frysinger return Z_NEED_DICT; 554*e89516f0SMike Frysinger } 555*e89516f0SMike Frysinger strm->adler = state->check = adler32(0L, Z_NULL, 0); 556*e89516f0SMike Frysinger state->mode = TYPE; 557*e89516f0SMike Frysinger case TYPE: 558*e89516f0SMike Frysinger WATCHDOG_RESET(); 559*e89516f0SMike Frysinger if (flush == Z_BLOCK) goto inf_leave; 560*e89516f0SMike Frysinger case TYPEDO: 561*e89516f0SMike Frysinger if (state->last) { 562*e89516f0SMike Frysinger BYTEBITS(); 563*e89516f0SMike Frysinger state->mode = CHECK; 564*e89516f0SMike Frysinger break; 565*e89516f0SMike Frysinger } 566*e89516f0SMike Frysinger NEEDBITS(3); 567*e89516f0SMike Frysinger state->last = BITS(1); 568*e89516f0SMike Frysinger DROPBITS(1); 569*e89516f0SMike Frysinger switch (BITS(2)) { 570*e89516f0SMike Frysinger case 0: /* stored block */ 571*e89516f0SMike Frysinger Tracev((stderr, "inflate: stored block%s\n", 572*e89516f0SMike Frysinger state->last ? " (last)" : "")); 573*e89516f0SMike Frysinger state->mode = STORED; 574*e89516f0SMike Frysinger break; 575*e89516f0SMike Frysinger case 1: /* fixed block */ 576*e89516f0SMike Frysinger fixedtables(state); 577*e89516f0SMike Frysinger Tracev((stderr, "inflate: fixed codes block%s\n", 578*e89516f0SMike Frysinger state->last ? " (last)" : "")); 579*e89516f0SMike Frysinger state->mode = LEN; /* decode codes */ 580*e89516f0SMike Frysinger break; 581*e89516f0SMike Frysinger case 2: /* dynamic block */ 582*e89516f0SMike Frysinger Tracev((stderr, "inflate: dynamic codes block%s\n", 583*e89516f0SMike Frysinger state->last ? " (last)" : "")); 584*e89516f0SMike Frysinger state->mode = TABLE; 585*e89516f0SMike Frysinger break; 586*e89516f0SMike Frysinger case 3: 587*e89516f0SMike Frysinger strm->msg = (char *)"invalid block type"; 588*e89516f0SMike Frysinger state->mode = BAD; 589*e89516f0SMike Frysinger } 590*e89516f0SMike Frysinger DROPBITS(2); 591*e89516f0SMike Frysinger break; 592*e89516f0SMike Frysinger case STORED: 593*e89516f0SMike Frysinger BYTEBITS(); /* go to byte boundary */ 594*e89516f0SMike Frysinger NEEDBITS(32); 595*e89516f0SMike Frysinger if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { 596*e89516f0SMike Frysinger strm->msg = (char *)"invalid stored block lengths"; 597*e89516f0SMike Frysinger state->mode = BAD; 598*e89516f0SMike Frysinger break; 599*e89516f0SMike Frysinger } 600*e89516f0SMike Frysinger state->length = (unsigned)hold & 0xffff; 601*e89516f0SMike Frysinger Tracev((stderr, "inflate: stored length %u\n", 602*e89516f0SMike Frysinger state->length)); 603*e89516f0SMike Frysinger INITBITS(); 604*e89516f0SMike Frysinger state->mode = COPY; 605*e89516f0SMike Frysinger case COPY: 606*e89516f0SMike Frysinger copy = state->length; 607*e89516f0SMike Frysinger if (copy) { 608*e89516f0SMike Frysinger if (copy > have) copy = have; 609*e89516f0SMike Frysinger if (copy > left) copy = left; 610*e89516f0SMike Frysinger if (copy == 0) goto inf_leave; 611*e89516f0SMike Frysinger zmemcpy(put, next, copy); 612*e89516f0SMike Frysinger have -= copy; 613*e89516f0SMike Frysinger next += copy; 614*e89516f0SMike Frysinger left -= copy; 615*e89516f0SMike Frysinger put += copy; 616*e89516f0SMike Frysinger state->length -= copy; 617*e89516f0SMike Frysinger break; 618*e89516f0SMike Frysinger } 619*e89516f0SMike Frysinger Tracev((stderr, "inflate: stored end\n")); 620*e89516f0SMike Frysinger state->mode = TYPE; 621*e89516f0SMike Frysinger break; 622*e89516f0SMike Frysinger case TABLE: 623*e89516f0SMike Frysinger NEEDBITS(14); 624*e89516f0SMike Frysinger state->nlen = BITS(5) + 257; 625*e89516f0SMike Frysinger DROPBITS(5); 626*e89516f0SMike Frysinger state->ndist = BITS(5) + 1; 627*e89516f0SMike Frysinger DROPBITS(5); 628*e89516f0SMike Frysinger state->ncode = BITS(4) + 4; 629*e89516f0SMike Frysinger DROPBITS(4); 630*e89516f0SMike Frysinger #ifndef PKZIP_BUG_WORKAROUND 631*e89516f0SMike Frysinger if (state->nlen > 286 || state->ndist > 30) { 632*e89516f0SMike Frysinger strm->msg = (char *)"too many length or distance symbols"; 633*e89516f0SMike Frysinger state->mode = BAD; 634*e89516f0SMike Frysinger break; 635*e89516f0SMike Frysinger } 636*e89516f0SMike Frysinger #endif 637*e89516f0SMike Frysinger Tracev((stderr, "inflate: table sizes ok\n")); 638*e89516f0SMike Frysinger state->have = 0; 639*e89516f0SMike Frysinger state->mode = LENLENS; 640*e89516f0SMike Frysinger case LENLENS: 641*e89516f0SMike Frysinger while (state->have < state->ncode) { 642*e89516f0SMike Frysinger NEEDBITS(3); 643*e89516f0SMike Frysinger state->lens[order[state->have++]] = (unsigned short)BITS(3); 644*e89516f0SMike Frysinger DROPBITS(3); 645*e89516f0SMike Frysinger } 646*e89516f0SMike Frysinger while (state->have < 19) 647*e89516f0SMike Frysinger state->lens[order[state->have++]] = 0; 648*e89516f0SMike Frysinger state->next = state->codes; 649*e89516f0SMike Frysinger state->lencode = (code const FAR *)(state->next); 650*e89516f0SMike Frysinger state->lenbits = 7; 651*e89516f0SMike Frysinger ret = inflate_table(CODES, state->lens, 19, &(state->next), 652*e89516f0SMike Frysinger &(state->lenbits), state->work); 653*e89516f0SMike Frysinger if (ret) { 654*e89516f0SMike Frysinger strm->msg = (char *)"invalid code lengths set"; 655*e89516f0SMike Frysinger state->mode = BAD; 656*e89516f0SMike Frysinger break; 657*e89516f0SMike Frysinger } 658*e89516f0SMike Frysinger Tracev((stderr, "inflate: code lengths ok\n")); 659*e89516f0SMike Frysinger state->have = 0; 660*e89516f0SMike Frysinger state->mode = CODELENS; 661*e89516f0SMike Frysinger case CODELENS: 662*e89516f0SMike Frysinger while (state->have < state->nlen + state->ndist) { 663*e89516f0SMike Frysinger for (;;) { 664*e89516f0SMike Frysinger this = state->lencode[BITS(state->lenbits)]; 665*e89516f0SMike Frysinger if ((unsigned)(this.bits) <= bits) break; 666*e89516f0SMike Frysinger PULLBYTE(); 667*e89516f0SMike Frysinger } 668*e89516f0SMike Frysinger if (this.val < 16) { 669*e89516f0SMike Frysinger NEEDBITS(this.bits); 670*e89516f0SMike Frysinger DROPBITS(this.bits); 671*e89516f0SMike Frysinger state->lens[state->have++] = this.val; 672*e89516f0SMike Frysinger } 673*e89516f0SMike Frysinger else { 674*e89516f0SMike Frysinger if (this.val == 16) { 675*e89516f0SMike Frysinger NEEDBITS(this.bits + 2); 676*e89516f0SMike Frysinger DROPBITS(this.bits); 677*e89516f0SMike Frysinger if (state->have == 0) { 678*e89516f0SMike Frysinger strm->msg = (char *)"invalid bit length repeat"; 679*e89516f0SMike Frysinger state->mode = BAD; 680*e89516f0SMike Frysinger break; 681*e89516f0SMike Frysinger } 682*e89516f0SMike Frysinger len = state->lens[state->have - 1]; 683*e89516f0SMike Frysinger copy = 3 + BITS(2); 684*e89516f0SMike Frysinger DROPBITS(2); 685*e89516f0SMike Frysinger } 686*e89516f0SMike Frysinger else if (this.val == 17) { 687*e89516f0SMike Frysinger NEEDBITS(this.bits + 3); 688*e89516f0SMike Frysinger DROPBITS(this.bits); 689*e89516f0SMike Frysinger len = 0; 690*e89516f0SMike Frysinger copy = 3 + BITS(3); 691*e89516f0SMike Frysinger DROPBITS(3); 692*e89516f0SMike Frysinger } 693*e89516f0SMike Frysinger else { 694*e89516f0SMike Frysinger NEEDBITS(this.bits + 7); 695*e89516f0SMike Frysinger DROPBITS(this.bits); 696*e89516f0SMike Frysinger len = 0; 697*e89516f0SMike Frysinger copy = 11 + BITS(7); 698*e89516f0SMike Frysinger DROPBITS(7); 699*e89516f0SMike Frysinger } 700*e89516f0SMike Frysinger if (state->have + copy > state->nlen + state->ndist) { 701*e89516f0SMike Frysinger strm->msg = (char *)"invalid bit length repeat"; 702*e89516f0SMike Frysinger state->mode = BAD; 703*e89516f0SMike Frysinger break; 704*e89516f0SMike Frysinger } 705*e89516f0SMike Frysinger while (copy--) 706*e89516f0SMike Frysinger state->lens[state->have++] = (unsigned short)len; 707*e89516f0SMike Frysinger } 708*e89516f0SMike Frysinger } 709*e89516f0SMike Frysinger 710*e89516f0SMike Frysinger /* handle error breaks in while */ 711*e89516f0SMike Frysinger if (state->mode == BAD) break; 712*e89516f0SMike Frysinger 713*e89516f0SMike Frysinger /* build code tables */ 714*e89516f0SMike Frysinger state->next = state->codes; 715*e89516f0SMike Frysinger state->lencode = (code const FAR *)(state->next); 716*e89516f0SMike Frysinger state->lenbits = 9; 717*e89516f0SMike Frysinger ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), 718*e89516f0SMike Frysinger &(state->lenbits), state->work); 719*e89516f0SMike Frysinger if (ret) { 720*e89516f0SMike Frysinger strm->msg = (char *)"invalid literal/lengths set"; 721*e89516f0SMike Frysinger state->mode = BAD; 722*e89516f0SMike Frysinger break; 723*e89516f0SMike Frysinger } 724*e89516f0SMike Frysinger state->distcode = (code const FAR *)(state->next); 725*e89516f0SMike Frysinger state->distbits = 6; 726*e89516f0SMike Frysinger ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, 727*e89516f0SMike Frysinger &(state->next), &(state->distbits), state->work); 728*e89516f0SMike Frysinger if (ret) { 729*e89516f0SMike Frysinger strm->msg = (char *)"invalid distances set"; 730*e89516f0SMike Frysinger state->mode = BAD; 731*e89516f0SMike Frysinger break; 732*e89516f0SMike Frysinger } 733*e89516f0SMike Frysinger Tracev((stderr, "inflate: codes ok\n")); 734*e89516f0SMike Frysinger state->mode = LEN; 735*e89516f0SMike Frysinger case LEN: 736*e89516f0SMike Frysinger WATCHDOG_RESET(); 737*e89516f0SMike Frysinger if (have >= 6 && left >= 258) { 738*e89516f0SMike Frysinger RESTORE(); 739*e89516f0SMike Frysinger inflate_fast(strm, out); 740*e89516f0SMike Frysinger LOAD(); 741*e89516f0SMike Frysinger break; 742*e89516f0SMike Frysinger } 743*e89516f0SMike Frysinger for (;;) { 744*e89516f0SMike Frysinger this = state->lencode[BITS(state->lenbits)]; 745*e89516f0SMike Frysinger if ((unsigned)(this.bits) <= bits) break; 746*e89516f0SMike Frysinger PULLBYTE(); 747*e89516f0SMike Frysinger } 748*e89516f0SMike Frysinger if (this.op && (this.op & 0xf0) == 0) { 749*e89516f0SMike Frysinger last = this; 750*e89516f0SMike Frysinger for (;;) { 751*e89516f0SMike Frysinger this = state->lencode[last.val + 752*e89516f0SMike Frysinger (BITS(last.bits + last.op) >> last.bits)]; 753*e89516f0SMike Frysinger if ((unsigned)(last.bits + this.bits) <= bits) break; 754*e89516f0SMike Frysinger PULLBYTE(); 755*e89516f0SMike Frysinger } 756*e89516f0SMike Frysinger DROPBITS(last.bits); 757*e89516f0SMike Frysinger } 758*e89516f0SMike Frysinger DROPBITS(this.bits); 759*e89516f0SMike Frysinger state->length = (unsigned)this.val; 760*e89516f0SMike Frysinger if ((int)(this.op) == 0) { 761*e89516f0SMike Frysinger Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? 762*e89516f0SMike Frysinger "inflate: literal '%c'\n" : 763*e89516f0SMike Frysinger "inflate: literal 0x%02x\n", this.val)); 764*e89516f0SMike Frysinger state->mode = LIT; 765*e89516f0SMike Frysinger break; 766*e89516f0SMike Frysinger } 767*e89516f0SMike Frysinger if (this.op & 32) { 768*e89516f0SMike Frysinger Tracevv((stderr, "inflate: end of block\n")); 769*e89516f0SMike Frysinger state->mode = TYPE; 770*e89516f0SMike Frysinger break; 771*e89516f0SMike Frysinger } 772*e89516f0SMike Frysinger if (this.op & 64) { 773*e89516f0SMike Frysinger strm->msg = (char *)"invalid literal/length code"; 774*e89516f0SMike Frysinger state->mode = BAD; 775*e89516f0SMike Frysinger break; 776*e89516f0SMike Frysinger } 777*e89516f0SMike Frysinger state->extra = (unsigned)(this.op) & 15; 778*e89516f0SMike Frysinger state->mode = LENEXT; 779*e89516f0SMike Frysinger case LENEXT: 780*e89516f0SMike Frysinger if (state->extra) { 781*e89516f0SMike Frysinger NEEDBITS(state->extra); 782*e89516f0SMike Frysinger state->length += BITS(state->extra); 783*e89516f0SMike Frysinger DROPBITS(state->extra); 784*e89516f0SMike Frysinger } 785*e89516f0SMike Frysinger Tracevv((stderr, "inflate: length %u\n", state->length)); 786*e89516f0SMike Frysinger state->mode = DIST; 787*e89516f0SMike Frysinger case DIST: 788*e89516f0SMike Frysinger for (;;) { 789*e89516f0SMike Frysinger this = state->distcode[BITS(state->distbits)]; 790*e89516f0SMike Frysinger if ((unsigned)(this.bits) <= bits) break; 791*e89516f0SMike Frysinger PULLBYTE(); 792*e89516f0SMike Frysinger } 793*e89516f0SMike Frysinger if ((this.op & 0xf0) == 0) { 794*e89516f0SMike Frysinger last = this; 795*e89516f0SMike Frysinger for (;;) { 796*e89516f0SMike Frysinger this = state->distcode[last.val + 797*e89516f0SMike Frysinger (BITS(last.bits + last.op) >> last.bits)]; 798*e89516f0SMike Frysinger if ((unsigned)(last.bits + this.bits) <= bits) break; 799*e89516f0SMike Frysinger PULLBYTE(); 800*e89516f0SMike Frysinger } 801*e89516f0SMike Frysinger DROPBITS(last.bits); 802*e89516f0SMike Frysinger } 803*e89516f0SMike Frysinger DROPBITS(this.bits); 804*e89516f0SMike Frysinger if (this.op & 64) { 805*e89516f0SMike Frysinger strm->msg = (char *)"invalid distance code"; 806*e89516f0SMike Frysinger state->mode = BAD; 807*e89516f0SMike Frysinger break; 808*e89516f0SMike Frysinger } 809*e89516f0SMike Frysinger state->offset = (unsigned)this.val; 810*e89516f0SMike Frysinger state->extra = (unsigned)(this.op) & 15; 811*e89516f0SMike Frysinger state->mode = DISTEXT; 812*e89516f0SMike Frysinger case DISTEXT: 813*e89516f0SMike Frysinger if (state->extra) { 814*e89516f0SMike Frysinger NEEDBITS(state->extra); 815*e89516f0SMike Frysinger state->offset += BITS(state->extra); 816*e89516f0SMike Frysinger DROPBITS(state->extra); 817*e89516f0SMike Frysinger } 818*e89516f0SMike Frysinger #ifdef INFLATE_STRICT 819*e89516f0SMike Frysinger if (state->offset > state->dmax) { 820*e89516f0SMike Frysinger strm->msg = (char *)"invalid distance too far back"; 821*e89516f0SMike Frysinger state->mode = BAD; 822*e89516f0SMike Frysinger break; 823*e89516f0SMike Frysinger } 824*e89516f0SMike Frysinger #endif 825*e89516f0SMike Frysinger if (state->offset > state->whave + out - left) { 826*e89516f0SMike Frysinger strm->msg = (char *)"invalid distance too far back"; 827*e89516f0SMike Frysinger state->mode = BAD; 828*e89516f0SMike Frysinger break; 829*e89516f0SMike Frysinger } 830*e89516f0SMike Frysinger Tracevv((stderr, "inflate: distance %u\n", state->offset)); 831*e89516f0SMike Frysinger state->mode = MATCH; 832*e89516f0SMike Frysinger case MATCH: 833*e89516f0SMike Frysinger if (left == 0) goto inf_leave; 834*e89516f0SMike Frysinger copy = out - left; 835*e89516f0SMike Frysinger if (state->offset > copy) { /* copy from window */ 836*e89516f0SMike Frysinger copy = state->offset - copy; 837*e89516f0SMike Frysinger if (copy > state->write) { 838*e89516f0SMike Frysinger copy -= state->write; 839*e89516f0SMike Frysinger from = state->window + (state->wsize - copy); 840*e89516f0SMike Frysinger } 841*e89516f0SMike Frysinger else 842*e89516f0SMike Frysinger from = state->window + (state->write - copy); 843*e89516f0SMike Frysinger if (copy > state->length) copy = state->length; 844*e89516f0SMike Frysinger } 845*e89516f0SMike Frysinger else { /* copy from output */ 846*e89516f0SMike Frysinger from = put - state->offset; 847*e89516f0SMike Frysinger copy = state->length; 848*e89516f0SMike Frysinger } 849*e89516f0SMike Frysinger if (copy > left) copy = left; 850*e89516f0SMike Frysinger left -= copy; 851*e89516f0SMike Frysinger state->length -= copy; 852*e89516f0SMike Frysinger do { 853*e89516f0SMike Frysinger *put++ = *from++; 854*e89516f0SMike Frysinger } while (--copy); 855*e89516f0SMike Frysinger if (state->length == 0) state->mode = LEN; 856*e89516f0SMike Frysinger break; 857*e89516f0SMike Frysinger case LIT: 858*e89516f0SMike Frysinger if (left == 0) goto inf_leave; 859*e89516f0SMike Frysinger *put++ = (unsigned char)(state->length); 860*e89516f0SMike Frysinger left--; 861*e89516f0SMike Frysinger state->mode = LEN; 862*e89516f0SMike Frysinger break; 863*e89516f0SMike Frysinger case CHECK: 864*e89516f0SMike Frysinger if (state->wrap) { 865*e89516f0SMike Frysinger NEEDBITS(32); 866*e89516f0SMike Frysinger out -= left; 867*e89516f0SMike Frysinger strm->total_out += out; 868*e89516f0SMike Frysinger state->total += out; 869*e89516f0SMike Frysinger if (out) 870*e89516f0SMike Frysinger strm->adler = state->check = 871*e89516f0SMike Frysinger UPDATE(state->check, put - out, out); 872*e89516f0SMike Frysinger out = left; 873*e89516f0SMike Frysinger if (( 874*e89516f0SMike Frysinger #ifdef GUNZIP 875*e89516f0SMike Frysinger state->flags ? hold : 876*e89516f0SMike Frysinger #endif 877*e89516f0SMike Frysinger REVERSE(hold)) != state->check) { 878*e89516f0SMike Frysinger strm->msg = (char *)"incorrect data check"; 879*e89516f0SMike Frysinger state->mode = BAD; 880*e89516f0SMike Frysinger break; 881*e89516f0SMike Frysinger } 882*e89516f0SMike Frysinger INITBITS(); 883*e89516f0SMike Frysinger Tracev((stderr, "inflate: check matches trailer\n")); 884*e89516f0SMike Frysinger } 885*e89516f0SMike Frysinger #ifdef GUNZIP 886*e89516f0SMike Frysinger state->mode = LENGTH; 887*e89516f0SMike Frysinger case LENGTH: 888*e89516f0SMike Frysinger if (state->wrap && state->flags) { 889*e89516f0SMike Frysinger NEEDBITS(32); 890*e89516f0SMike Frysinger if (hold != (state->total & 0xffffffffUL)) { 891*e89516f0SMike Frysinger strm->msg = (char *)"incorrect length check"; 892*e89516f0SMike Frysinger state->mode = BAD; 893*e89516f0SMike Frysinger break; 894*e89516f0SMike Frysinger } 895*e89516f0SMike Frysinger INITBITS(); 896*e89516f0SMike Frysinger Tracev((stderr, "inflate: length matches trailer\n")); 897*e89516f0SMike Frysinger } 898*e89516f0SMike Frysinger #endif 899*e89516f0SMike Frysinger state->mode = DONE; 900*e89516f0SMike Frysinger case DONE: 901*e89516f0SMike Frysinger ret = Z_STREAM_END; 902*e89516f0SMike Frysinger goto inf_leave; 903*e89516f0SMike Frysinger case BAD: 904*e89516f0SMike Frysinger ret = Z_DATA_ERROR; 905*e89516f0SMike Frysinger goto inf_leave; 906*e89516f0SMike Frysinger case MEM: 907*e89516f0SMike Frysinger return Z_MEM_ERROR; 908*e89516f0SMike Frysinger case SYNC: 909*e89516f0SMike Frysinger default: 910*e89516f0SMike Frysinger return Z_STREAM_ERROR; 911*e89516f0SMike Frysinger } 912*e89516f0SMike Frysinger 913*e89516f0SMike Frysinger /* 914*e89516f0SMike Frysinger Return from inflate(), updating the total counts and the check value. 915*e89516f0SMike Frysinger If there was no progress during the inflate() call, return a buffer 916*e89516f0SMike Frysinger error. Call updatewindow() to create and/or update the window state. 917*e89516f0SMike Frysinger Note: a memory error from inflate() is non-recoverable. 918*e89516f0SMike Frysinger */ 919*e89516f0SMike Frysinger inf_leave: 920*e89516f0SMike Frysinger RESTORE(); 921*e89516f0SMike Frysinger if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) 922*e89516f0SMike Frysinger if (updatewindow(strm, out)) { 923*e89516f0SMike Frysinger state->mode = MEM; 924*e89516f0SMike Frysinger return Z_MEM_ERROR; 925*e89516f0SMike Frysinger } 926*e89516f0SMike Frysinger in -= strm->avail_in; 927*e89516f0SMike Frysinger out -= strm->avail_out; 928*e89516f0SMike Frysinger strm->total_in += in; 929*e89516f0SMike Frysinger strm->total_out += out; 930*e89516f0SMike Frysinger state->total += out; 931*e89516f0SMike Frysinger if (state->wrap && out) 932*e89516f0SMike Frysinger strm->adler = state->check = 933*e89516f0SMike Frysinger UPDATE(state->check, strm->next_out - out, out); 934*e89516f0SMike Frysinger strm->data_type = state->bits + (state->last ? 64 : 0) + 935*e89516f0SMike Frysinger (state->mode == TYPE ? 128 : 0); 936*e89516f0SMike Frysinger if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) 937*e89516f0SMike Frysinger ret = Z_BUF_ERROR; 938*e89516f0SMike Frysinger return ret; 939*e89516f0SMike Frysinger } 940*e89516f0SMike Frysinger 941*e89516f0SMike Frysinger int ZEXPORT inflateEnd(strm) 942*e89516f0SMike Frysinger z_streamp strm; 943*e89516f0SMike Frysinger { 944*e89516f0SMike Frysinger struct inflate_state FAR *state; 945*e89516f0SMike Frysinger if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) 946*e89516f0SMike Frysinger return Z_STREAM_ERROR; 947*e89516f0SMike Frysinger state = (struct inflate_state FAR *)strm->state; 948*e89516f0SMike Frysinger if (state->window != Z_NULL) { 949*e89516f0SMike Frysinger WATCHDOG_RESET(); 950*e89516f0SMike Frysinger ZFREE(strm, state->window); 951*e89516f0SMike Frysinger } 952*e89516f0SMike Frysinger ZFREE(strm, strm->state); 953*e89516f0SMike Frysinger strm->state = Z_NULL; 954*e89516f0SMike Frysinger Tracev((stderr, "inflate: end\n")); 955*e89516f0SMike Frysinger return Z_OK; 956*e89516f0SMike Frysinger } 957