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