Index: third_party/zlib/inflate.c |
diff --git a/third_party/zlib/inflate.c b/third_party/zlib/inflate.c |
index a8431abeacffd97e5028a9e54135a5f173528960..870f89bb4d3646684bf37e2144c4b83c808ab84d 100644 |
--- a/third_party/zlib/inflate.c |
+++ b/third_party/zlib/inflate.c |
@@ -1,5 +1,5 @@ |
/* inflate.c -- zlib decompression |
- * Copyright (C) 1995-2010 Mark Adler |
+ * Copyright (C) 1995-2012 Mark Adler |
* For conditions of distribution and use, see copyright notice in zlib.h |
*/ |
@@ -93,14 +93,15 @@ |
/* function prototypes */ |
local void fixedtables OF((struct inflate_state FAR *state)); |
-local int updatewindow OF((z_streamp strm, unsigned out)); |
+local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, |
+ unsigned copy)); |
#ifdef BUILDFIXED |
void makefixed OF((void)); |
#endif |
-local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, |
+local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, |
unsigned len)); |
-int ZEXPORT inflateReset(strm) |
+int ZEXPORT inflateResetKeep(strm) |
z_streamp strm; |
{ |
struct inflate_state FAR *state; |
@@ -109,15 +110,13 @@ z_streamp strm; |
state = (struct inflate_state FAR *)strm->state; |
strm->total_in = strm->total_out = state->total = 0; |
strm->msg = Z_NULL; |
- strm->adler = 1; /* to support ill-conceived Java test suite */ |
+ if (state->wrap) /* to support ill-conceived Java test suite */ |
+ strm->adler = state->wrap & 1; |
state->mode = HEAD; |
state->last = 0; |
state->havedict = 0; |
state->dmax = 32768U; |
state->head = Z_NULL; |
- state->wsize = 0; |
- state->whave = 0; |
- state->wnext = 0; |
state->hold = 0; |
state->bits = 0; |
state->lencode = state->distcode = state->next = state->codes; |
@@ -127,6 +126,19 @@ z_streamp strm; |
return Z_OK; |
} |
+int ZEXPORT inflateReset(strm) |
+z_streamp strm; |
+{ |
+ struct inflate_state FAR *state; |
+ |
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; |
+ state = (struct inflate_state FAR *)strm->state; |
+ state->wsize = 0; |
+ state->whave = 0; |
+ state->wnext = 0; |
+ return inflateResetKeep(strm); |
+} |
+ |
int ZEXPORT inflateReset2(strm, windowBits) |
z_streamp strm; |
int windowBits; |
@@ -180,10 +192,19 @@ int stream_size; |
if (strm == Z_NULL) return Z_STREAM_ERROR; |
strm->msg = Z_NULL; /* in case we return an error */ |
if (strm->zalloc == (alloc_func)0) { |
+#ifdef Z_SOLO |
+ return Z_STREAM_ERROR; |
+#else |
strm->zalloc = zcalloc; |
strm->opaque = (voidpf)0; |
+#endif |
} |
- if (strm->zfree == (free_func)0) strm->zfree = zcfree; |
+ if (strm->zfree == (free_func)0) |
+#ifdef Z_SOLO |
+ return Z_STREAM_ERROR; |
+#else |
+ strm->zfree = zcfree; |
+#endif |
state = (struct inflate_state FAR *) |
ZALLOC(strm, 1, sizeof(struct inflate_state)); |
if (state == Z_NULL) return Z_MEM_ERROR; |
@@ -321,8 +342,8 @@ void makefixed() |
low = 0; |
for (;;) { |
if ((low % 7) == 0) printf("\n "); |
- printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, |
- state.lencode[low].val); |
+ printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, |
+ state.lencode[low].bits, state.lencode[low].val); |
if (++low == size) break; |
putchar(','); |
} |
@@ -355,12 +376,13 @@ void makefixed() |
output will fall in the output data, making match copies simpler and faster. |
The advantage may be dependent on the size of the processor's data caches. |
*/ |
-local int updatewindow(strm, out) |
+local int updatewindow(strm, end, copy) |
z_streamp strm; |
-unsigned out; |
+const Bytef *end; |
+unsigned copy; |
{ |
struct inflate_state FAR *state; |
- unsigned copy, dist; |
+ unsigned dist; |
state = (struct inflate_state FAR *)strm->state; |
@@ -380,19 +402,18 @@ unsigned out; |
} |
/* copy state->wsize or less output bytes into the circular window */ |
- copy = out - strm->avail_out; |
if (copy >= state->wsize) { |
- zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); |
+ zmemcpy(state->window, end - state->wsize, state->wsize); |
state->wnext = 0; |
state->whave = state->wsize; |
} |
else { |
dist = state->wsize - state->wnext; |
if (dist > copy) dist = copy; |
- zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); |
+ zmemcpy(state->window + state->wnext, end - copy, dist); |
copy -= dist; |
if (copy) { |
- zmemcpy(state->window, strm->next_out - copy, copy); |
+ zmemcpy(state->window, end - copy, copy); |
state->wnext = copy; |
state->whave = state->wsize; |
} |
@@ -499,11 +520,6 @@ unsigned out; |
bits -= bits & 7; \ |
} while (0) |
-/* Reverse the bytes in a 32-bit value */ |
-#define REVERSE(q) \ |
- ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ |
- (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) |
- |
/* |
inflate() uses a state machine to process as much input data and generate as |
much output data as possible before returning. The state machine is |
@@ -591,7 +607,7 @@ z_streamp strm; |
int flush; |
{ |
struct inflate_state FAR *state; |
- unsigned char FAR *next; /* next input */ |
+ z_const unsigned char FAR *next; /* next input */ |
unsigned char FAR *put; /* next output */ |
unsigned have, left; /* available input and output */ |
unsigned long hold; /* bit buffer */ |
@@ -797,7 +813,7 @@ int flush; |
#endif |
case DICTID: |
NEEDBITS(32); |
- strm->adler = state->check = REVERSE(hold); |
+ strm->adler = state->check = ZSWAP32(hold); |
INITBITS(); |
state->mode = DICT; |
case DICT: |
@@ -905,7 +921,7 @@ int flush; |
while (state->have < 19) |
state->lens[order[state->have++]] = 0; |
state->next = state->codes; |
- state->lencode = (code const FAR *)(state->next); |
+ state->lencode = (const code FAR *)(state->next); |
state->lenbits = 7; |
ret = inflate_table(CODES, state->lens, 19, &(state->next), |
&(state->lenbits), state->work); |
@@ -925,7 +941,6 @@ int flush; |
PULLBYTE(); |
} |
if (here.val < 16) { |
- NEEDBITS(here.bits); |
DROPBITS(here.bits); |
state->lens[state->have++] = here.val; |
} |
@@ -980,7 +995,7 @@ int flush; |
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->lencode = (const code FAR *)(state->next); |
state->lenbits = 9; |
ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), |
&(state->lenbits), state->work); |
@@ -989,7 +1004,7 @@ int flush; |
state->mode = BAD; |
break; |
} |
- state->distcode = (code const FAR *)(state->next); |
+ state->distcode = (const code FAR *)(state->next); |
state->distbits = 6; |
ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, |
&(state->next), &(state->distbits), state->work); |
@@ -1170,7 +1185,7 @@ int flush; |
#ifdef GUNZIP |
state->flags ? hold : |
#endif |
- REVERSE(hold)) != state->check) { |
+ ZSWAP32(hold)) != state->check) { |
strm->msg = (char *)"incorrect data check"; |
state->mode = BAD; |
break; |
@@ -1214,8 +1229,9 @@ int flush; |
*/ |
inf_leave: |
RESTORE(); |
- if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) |
- if (updatewindow(strm, out)) { |
+ if (state->wsize || (out != strm->avail_out && state->mode < BAD && |
+ (state->mode < CHECK || flush != Z_FINISH))) |
+ if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { |
state->mode = MEM; |
return Z_MEM_ERROR; |
} |
@@ -1249,13 +1265,37 @@ z_streamp strm; |
return Z_OK; |
} |
+int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) |
+z_streamp strm; |
+Bytef *dictionary; |
+uInt *dictLength; |
+{ |
+ struct inflate_state FAR *state; |
+ |
+ /* check state */ |
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; |
+ state = (struct inflate_state FAR *)strm->state; |
+ |
+ /* copy dictionary */ |
+ if (state->whave && dictionary != Z_NULL) { |
+ zmemcpy(dictionary, state->window + state->wnext, |
+ state->whave - state->wnext); |
+ zmemcpy(dictionary + state->whave - state->wnext, |
+ state->window, state->wnext); |
+ } |
+ if (dictLength != Z_NULL) |
+ *dictLength = state->whave; |
+ return Z_OK; |
+} |
+ |
int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) |
z_streamp strm; |
const Bytef *dictionary; |
uInt dictLength; |
{ |
struct inflate_state FAR *state; |
- unsigned long id; |
+ unsigned long dictid; |
+ int ret; |
/* check state */ |
if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; |
@@ -1263,29 +1303,21 @@ uInt dictLength; |
if (state->wrap != 0 && state->mode != DICT) |
return Z_STREAM_ERROR; |
- /* check for correct dictionary id */ |
+ /* check for correct dictionary identifier */ |
if (state->mode == DICT) { |
- id = adler32(0L, Z_NULL, 0); |
- id = adler32(id, dictionary, dictLength); |
- if (id != state->check) |
+ dictid = adler32(0L, Z_NULL, 0); |
+ dictid = adler32(dictid, dictionary, dictLength); |
+ if (dictid != state->check) |
return Z_DATA_ERROR; |
} |
- /* copy dictionary to window */ |
- if (updatewindow(strm, strm->avail_out)) { |
+ /* copy dictionary to window using updatewindow(), which will amend the |
+ existing dictionary if appropriate */ |
+ ret = updatewindow(strm, dictionary + dictLength, dictLength); |
+ if (ret) { |
state->mode = MEM; |
return Z_MEM_ERROR; |
} |
- if (dictLength > state->wsize) { |
- zmemcpy(state->window, dictionary + dictLength - state->wsize, |
- state->wsize); |
- state->whave = state->wsize; |
- } |
- else { |
- zmemcpy(state->window + state->wsize - dictLength, dictionary, |
- dictLength); |
- state->whave = dictLength; |
- } |
state->havedict = 1; |
Tracev((stderr, "inflate: dictionary set\n")); |
return Z_OK; |
@@ -1321,7 +1353,7 @@ gz_headerp head; |
*/ |
local unsigned syncsearch(have, buf, len) |
unsigned FAR *have; |
-unsigned char FAR *buf; |
+const unsigned char FAR *buf; |
unsigned len; |
{ |
unsigned got; |
@@ -1433,8 +1465,8 @@ z_streamp source; |
} |
/* copy state */ |
- zmemcpy(dest, source, sizeof(z_stream)); |
- zmemcpy(copy, state, sizeof(struct inflate_state)); |
+ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); |
+ zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); |
if (state->lencode >= state->codes && |
state->lencode <= state->codes + ENOUGH - 1) { |
copy->lencode = copy->codes + (state->lencode - state->codes); |