| Index: third_party/zlib/infback.c
|
| ===================================================================
|
| --- third_party/zlib/infback.c (revision 113739)
|
| +++ 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);
|
|
|