Index: third_party/zlib/infback.c |
=================================================================== |
--- third_party/zlib/infback.c (revision 112951) |
+++ third_party/zlib/infback.c (working copy) |
@@ -1,5 +1,5 @@ |
/* infback.c -- inflate using a call-back interface |
- * Copyright (C) 1995-2005 Mark Adler |
+ * Copyright (C) 1995-2009 Mark Adler |
* For conditions of distribution and use, see copyright notice in zlib.h |
*/ |
@@ -55,7 +55,7 @@ |
state->wbits = windowBits; |
state->wsize = 1U << windowBits; |
state->window = window; |
- state->write = 0; |
+ state->wnext = 0; |
state->whave = 0; |
return Z_OK; |
} |
@@ -253,7 +253,7 @@ |
unsigned bits; /* bits in bit buffer */ |
unsigned copy; /* number of stored or match bytes to copy */ |
unsigned char FAR *from; /* where to copy match bytes from */ |
- code this; /* current decoding table entry */ |
+ code here; /* current decoding table entry */ |
code last; /* parent table entry */ |
unsigned len; /* length to copy for repeats, bits to drop */ |
int ret; /* return code */ |
@@ -389,19 +389,19 @@ |
state->have = 0; |
while (state->have < state->nlen + state->ndist) { |
for (;;) { |
- this = state->lencode[BITS(state->lenbits)]; |
- if ((unsigned)(this.bits) <= bits) break; |
+ here = state->lencode[BITS(state->lenbits)]; |
+ if ((unsigned)(here.bits) <= bits) break; |
PULLBYTE(); |
} |
- if (this.val < 16) { |
- NEEDBITS(this.bits); |
- DROPBITS(this.bits); |
- state->lens[state->have++] = this.val; |
+ if (here.val < 16) { |
+ NEEDBITS(here.bits); |
+ DROPBITS(here.bits); |
+ state->lens[state->have++] = here.val; |
} |
else { |
- if (this.val == 16) { |
- NEEDBITS(this.bits + 2); |
- DROPBITS(this.bits); |
+ if (here.val == 16) { |
+ NEEDBITS(here.bits + 2); |
+ DROPBITS(here.bits); |
if (state->have == 0) { |
strm->msg = (char *)"invalid bit length repeat"; |
state->mode = BAD; |
@@ -411,16 +411,16 @@ |
copy = 3 + BITS(2); |
DROPBITS(2); |
} |
- else if (this.val == 17) { |
- NEEDBITS(this.bits + 3); |
- DROPBITS(this.bits); |
+ else if (here.val == 17) { |
+ NEEDBITS(here.bits + 3); |
+ DROPBITS(here.bits); |
len = 0; |
copy = 3 + BITS(3); |
DROPBITS(3); |
} |
else { |
- NEEDBITS(this.bits + 7); |
- DROPBITS(this.bits); |
+ NEEDBITS(here.bits + 7); |
+ DROPBITS(here.bits); |
len = 0; |
copy = 11 + BITS(7); |
DROPBITS(7); |
@@ -438,7 +438,16 @@ |
/* handle error breaks in while */ |
if (state->mode == BAD) break; |
- /* build code tables */ |
+ /* check for end-of-block code (better have one) */ |
+ if (state->lens[256] == 0) { |
+ strm->msg = (char *)"invalid code -- missing end-of-block"; |
+ state->mode = BAD; |
+ break; |
+ } |
+ |
+ /* build code tables -- note: do not change the lenbits or distbits |
+ values here (9 and 6) without reading the comments in inftrees.h |
+ concerning the ENOUGH constants, which depend on those values */ |
state->next = state->codes; |
state->lencode = (code const FAR *)(state->next); |
state->lenbits = 9; |
@@ -474,28 +483,28 @@ |
/* get a literal, length, or end-of-block code */ |
for (;;) { |
- this = state->lencode[BITS(state->lenbits)]; |
- if ((unsigned)(this.bits) <= bits) break; |
+ here = state->lencode[BITS(state->lenbits)]; |
+ if ((unsigned)(here.bits) <= bits) break; |
PULLBYTE(); |
} |
- if (this.op && (this.op & 0xf0) == 0) { |
- last = this; |
+ if (here.op && (here.op & 0xf0) == 0) { |
+ last = here; |
for (;;) { |
- this = state->lencode[last.val + |
+ here = state->lencode[last.val + |
(BITS(last.bits + last.op) >> last.bits)]; |
- if ((unsigned)(last.bits + this.bits) <= bits) break; |
+ if ((unsigned)(last.bits + here.bits) <= bits) break; |
PULLBYTE(); |
} |
DROPBITS(last.bits); |
} |
- DROPBITS(this.bits); |
- state->length = (unsigned)this.val; |
+ DROPBITS(here.bits); |
+ state->length = (unsigned)here.val; |
/* process literal */ |
- if (this.op == 0) { |
- Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? |
+ if (here.op == 0) { |
+ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? |
"inflate: literal '%c'\n" : |
- "inflate: literal 0x%02x\n", this.val)); |
+ "inflate: literal 0x%02x\n", here.val)); |
ROOM(); |
*put++ = (unsigned char)(state->length); |
left--; |
@@ -504,21 +513,21 @@ |
} |
/* process end of block */ |
- if (this.op & 32) { |
+ if (here.op & 32) { |
Tracevv((stderr, "inflate: end of block\n")); |
state->mode = TYPE; |
break; |
} |
/* invalid code */ |
- if (this.op & 64) { |
+ if (here.op & 64) { |
strm->msg = (char *)"invalid literal/length code"; |
state->mode = BAD; |
break; |
} |
/* length code -- get extra bits, if any */ |
- state->extra = (unsigned)(this.op) & 15; |
+ state->extra = (unsigned)(here.op) & 15; |
if (state->extra != 0) { |
NEEDBITS(state->extra); |
state->length += BITS(state->extra); |
@@ -528,30 +537,30 @@ |
/* get distance code */ |
for (;;) { |
- this = state->distcode[BITS(state->distbits)]; |
- if ((unsigned)(this.bits) <= bits) break; |
+ here = state->distcode[BITS(state->distbits)]; |
+ if ((unsigned)(here.bits) <= bits) break; |
PULLBYTE(); |
} |
- if ((this.op & 0xf0) == 0) { |
- last = this; |
+ if ((here.op & 0xf0) == 0) { |
+ last = here; |
for (;;) { |
- this = state->distcode[last.val + |
+ here = state->distcode[last.val + |
(BITS(last.bits + last.op) >> last.bits)]; |
- if ((unsigned)(last.bits + this.bits) <= bits) break; |
+ if ((unsigned)(last.bits + here.bits) <= bits) break; |
PULLBYTE(); |
} |
DROPBITS(last.bits); |
} |
- DROPBITS(this.bits); |
- if (this.op & 64) { |
+ DROPBITS(here.bits); |
+ if (here.op & 64) { |
strm->msg = (char *)"invalid distance code"; |
state->mode = BAD; |
break; |
} |
- state->offset = (unsigned)this.val; |
+ state->offset = (unsigned)here.val; |
/* get distance extra bits, if any */ |
- state->extra = (unsigned)(this.op) & 15; |
+ state->extra = (unsigned)(here.op) & 15; |
if (state->extra != 0) { |
NEEDBITS(state->extra); |
state->offset += BITS(state->extra); |