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