1ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* inflate.c -- zlib interface to inflate modules 2ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * Copyright (C) 1995-2002 Mark Adler 3ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * For conditions of distribution and use, see copyright notice in zlib.h 4ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 5ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 6ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "zutil.h" 7ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "infblock.h" 8ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 9ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define DONE INFLATE_DONE 10ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define BAD INFLATE_BAD 11ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 12ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasetypedef enum { 13ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease METHOD, /* waiting for method byte */ 14ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FLAG, /* waiting for flag byte */ 15ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease DICT4, /* four dictionary check bytes to go */ 16ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease DICT3, /* three dictionary check bytes to go */ 17ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease DICT2, /* two dictionary check bytes to go */ 18ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease DICT1, /* one dictionary check byte to go */ 19ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease DICT0, /* waiting for inflateSetDictionary */ 20ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease BLOCKS, /* decompressing blocks */ 21ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease CHECK4, /* four check bytes to go */ 22ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease CHECK3, /* three check bytes to go */ 23ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease CHECK2, /* two check bytes to go */ 24ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease CHECK1, /* one check byte to go */ 25ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease DONE, /* finished check, done */ 26ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease BAD} /* got an error--stay here */ 27ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_mode; 28ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 29ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* inflate private state */ 30ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasestruct internal_state { 31ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 32ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* mode */ 33ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_mode mode; /* current inflate mode */ 34ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 35ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* mode dependent information */ 36ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease union { 37ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt method; /* if FLAGS, method byte */ 38ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease struct { 39ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uLong was; /* computed check value */ 40ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uLong need; /* stream check value */ 41ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } check; /* if CHECK, check values to compare */ 42ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt marker; /* if BAD, inflateSync's marker bytes count */ 43ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } sub; /* submode */ 44ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 45ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* mode independent information */ 46ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease int nowrap; /* flag for no wrapper */ 47ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt wbits; /* log2(window size) (8..15, defaults to 15) */ 48ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_blocks_statef 49ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *blocks; /* current inflate_blocks state */ 50ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 51ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease}; 52ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 53ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 54ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseZEXPORT(int) inflateReset( /* z) */ 55ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasez_streamp z ) 56ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 57ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (z == Z_NULL || z->state == Z_NULL) 58ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_STREAM_ERROR; 59ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->total_in = z->total_out = 0; 60ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = Z_NULL; 61ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = z->state->nowrap ? BLOCKS : METHOD; 62ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_blocks_reset(z->state->blocks, z, Z_NULL); 63ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Tracev((stderr, "inflate: reset\n")); 64ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_OK; 65ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 66ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 67ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 68ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseZEXPORT(int) inflateEnd( /* z) */ 69ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasez_streamp z ) 70ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 71ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) 72ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_STREAM_ERROR; 73ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (z->state->blocks != Z_NULL) 74ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_blocks_free(z->state->blocks, z); 75ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ZFREE(z, z->state); 76ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state = Z_NULL; 77ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Tracev((stderr, "inflate: end\n")); 78ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_OK; 79ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 80ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 81ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 82ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseZEXPORT(int) inflateInit2_( /* z, w, version, stream_size) */ 83ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasez_streamp z, 84ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseint w, 85ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseconst char *version, 86ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseint stream_size ) 87ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 88ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || 89ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream_size != sizeof(z_stream)) 90ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_VERSION_ERROR; 91ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 92ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* initialize state */ 93ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (z == Z_NULL) 94ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_STREAM_ERROR; 95ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = Z_NULL; 96ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (z->zalloc == Z_NULL) 97ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 98ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->zalloc = zcalloc; 99ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->opaque = (voidpf)0; 100ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 101ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (z->zfree == Z_NULL) z->zfree = zcfree; 102ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((z->state = (struct internal_state FAR *) 103ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) 104ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_MEM_ERROR; 105ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->blocks = Z_NULL; 106ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 107ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* handle undocumented nowrap option (no zlib header or check) */ 108ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->nowrap = 0; 109ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (w < 0) 110ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 111ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease w = - w; 112ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->nowrap = 1; 113ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 114ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 115ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* set window size */ 116ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (w < 8 || w > 15) 117ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 118ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflateEnd(z); 119ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_STREAM_ERROR; 120ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 121ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->wbits = (uInt)w; 122ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 123ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* create inflate_blocks state */ 124ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((z->state->blocks = 125ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w)) 126ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease == Z_NULL) 127ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 128ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflateEnd(z); 129ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_MEM_ERROR; 130ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 131ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Tracev((stderr, "inflate: allocated\n")); 132ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 133ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* reset state */ 134ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflateReset(z); 135ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_OK; 136ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 137ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 138ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 139ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 140ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef NEEDBYTE 141ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define NEEDBYTE {if(z->avail_in==0)return r;r=f;} 142ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 143ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef NEXTBYTE 144ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) 145ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 146ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 147ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseZEXPORT(int) inflate( /* z, f) */ 148ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasez_streamp z, 149ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseint f ) 150ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 151ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease int r; 152ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt b; 153ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 154ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL) 155ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_STREAM_ERROR; 156ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; 157ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = Z_BUF_ERROR; 158ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease while (1) switch (z->state->mode) 159ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 160ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case METHOD: 161ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBYTE 162ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) 163ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 164ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = BAD; 165ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"unknown compression method"; 166ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.marker = 5; /* can't try inflateSync */ 167ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 168ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 169ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((z->state->sub.method >> 4) + 8 > z->state->wbits) 170ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 171ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = BAD; 172ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"invalid window size"; 173ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.marker = 5; /* can't try inflateSync */ 174ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 175ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 176ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = FLAG; 177ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case FLAG: 178ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBYTE 179ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease b = NEXTBYTE; 180ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (((z->state->sub.method << 8) + b) % 31) 181ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 182ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = BAD; 183ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"incorrect header check"; 184ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.marker = 5; /* can't try inflateSync */ 185ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 186ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 187ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Tracev((stderr, "inflate: zlib header ok\n")); 188ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (!(b & PRESET_DICT)) 189ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 190ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = BLOCKS; 191ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 192ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 193ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = DICT4; 194ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case DICT4: 195ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBYTE 196ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.check.need = (uLong)NEXTBYTE << 24; 197ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = DICT3; 198ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case DICT3: 199ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBYTE 200ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.check.need += (uLong)NEXTBYTE << 16; 201ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = DICT2; 202ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case DICT2: 203ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBYTE 204ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.check.need += (uLong)NEXTBYTE << 8; 205ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = DICT1; 206ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case DICT1: 207ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBYTE 208ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.check.need += (uLong)NEXTBYTE; 209ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->adler = z->state->sub.check.need; 210ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = DICT0; 211ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_NEED_DICT; 212ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case DICT0: 213ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = BAD; 214ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"need dictionary"; 215ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.marker = 0; /* can try inflateSync */ 216ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_STREAM_ERROR; 217ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case BLOCKS: 218ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = inflate_blocks(z->state->blocks, z, r); 219ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (r == Z_DATA_ERROR) 220ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 221ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = BAD; 222ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.marker = 0; /* can try inflateSync */ 223ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 224ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 225ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (r == Z_OK) 226ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = f; 227ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (r != Z_STREAM_END) 228ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return r; 229ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = f; 230ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); 231ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (z->state->nowrap) 232ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 233ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = DONE; 234ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 235ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 236ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = CHECK4; 237ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case CHECK4: 238ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBYTE 239ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.check.need = (uLong)NEXTBYTE << 24; 240ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = CHECK3; 241ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case CHECK3: 242ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBYTE 243ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.check.need += (uLong)NEXTBYTE << 16; 244ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = CHECK2; 245ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case CHECK2: 246ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBYTE 247ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.check.need += (uLong)NEXTBYTE << 8; 248ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = CHECK1; 249ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case CHECK1: 250ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBYTE 251ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.check.need += (uLong)NEXTBYTE; 252ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 253ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (z->state->sub.check.was != z->state->sub.check.need) 254ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 255ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = BAD; 256ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"incorrect data check"; 257ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->sub.marker = 5; /* can't try inflateSync */ 258ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 259ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 260ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Tracev((stderr, "inflate: zlib check ok\n")); 261ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->state->mode = DONE; 262ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case DONE: 263ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_STREAM_END; 264ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case BAD: 265ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_DATA_ERROR; 266ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease default: 267ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_STREAM_ERROR; 268ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 269ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifdef NEED_DUMMY_RETURN 270ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ 271ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 272ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 273ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 274