summaryrefslogtreecommitdiffstats
path: root/third_party/zlib
diff options
context:
space:
mode:
authoragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-14 18:25:33 +0000
committeragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-14 18:25:33 +0000
commitc84b42002c558e2eaff044167b6c22a090c74bfc (patch)
treef838a2982b6f87108d9d3319fa1f530025e40a3e /third_party/zlib
parentf46da80874c20d9c1fc64787bb79e324f74812f6 (diff)
downloadchromium_src-c84b42002c558e2eaff044167b6c22a090c74bfc.zip
chromium_src-c84b42002c558e2eaff044167b6c22a090c74bfc.tar.gz
chromium_src-c84b42002c558e2eaff044167b6c22a090c74bfc.tar.bz2
Revert "net: workaround compression leaks"
This reverts r151502. git-svn-id: svn://svn.chromium.org/chrome/trunk/src@151517 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'third_party/zlib')
-rw-r--r--third_party/zlib/README.chromium3
-rw-r--r--third_party/zlib/deflate.c249
-rw-r--r--third_party/zlib/deflate.h5
-rw-r--r--third_party/zlib/mixed-source.patch469
-rw-r--r--third_party/zlib/zlib.gyp8
-rw-r--r--third_party/zlib/zlib.h5
6 files changed, 31 insertions, 708 deletions
diff --git a/third_party/zlib/README.chromium b/third_party/zlib/README.chromium
index 81d20ef..aa5d4a5 100644
--- a/third_party/zlib/README.chromium
+++ b/third_party/zlib/README.chromium
@@ -16,6 +16,3 @@ A few minor changes, all marked with "Google":
- Added 'mozzconf.h' to mangle the function names.
- Added an #ifdef to prevent zlib.h from mangling its functions.
The 'google.patch' file represents our changes from the original zlib-1.2.5.
-
-A more significant change to support mixed-source data compression. See
-crbug.com/139744 and mixed-source.patch.
diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c
index e419858..5c4022f 100644
--- a/third_party/zlib/deflate.c
+++ b/third_party/zlib/deflate.c
@@ -70,15 +70,14 @@ typedef enum {
finish_done /* finish done, accept no more input or output */
} block_state;
-typedef block_state (*compress_func) OF((deflate_state *s, int flush,
- int clas));
+typedef block_state (*compress_func) OF((deflate_state *s, int flush));
/* Compression function. Returns the block state after the call. */
local void fill_window OF((deflate_state *s));
-local block_state deflate_stored OF((deflate_state *s, int flush, int clas));
-local block_state deflate_fast OF((deflate_state *s, int flush, int clas));
+local block_state deflate_stored OF((deflate_state *s, int flush));
+local block_state deflate_fast OF((deflate_state *s, int flush));
#ifndef FASTEST
-local block_state deflate_slow OF((deflate_state *s, int flush, int clas));
+local block_state deflate_slow OF((deflate_state *s, int flush));
#endif
local block_state deflate_rle OF((deflate_state *s, int flush));
local block_state deflate_huff OF((deflate_state *s, int flush));
@@ -88,9 +87,9 @@ local void flush_pending OF((z_streamp strm));
local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
#ifdef ASMV
void match_init OF((void)); /* asm code initialization */
- uInt longest_match OF((deflate_state *s, IPos cur_match, int clas));
+ uInt longest_match OF((deflate_state *s, IPos cur_match));
#else
-local uInt longest_match OF((deflate_state *s, IPos cur_match, int clas));
+local uInt longest_match OF((deflate_state *s, IPos cur_match));
#endif
#ifdef DEBUG
@@ -282,9 +281,6 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
- s->class_bitmap = NULL;
- zmemzero(&s->cookie_locations, sizeof(s->cookie_locations));
- strm->clas = 0;
s->high_water = 0; /* nothing written to s->window yet */
@@ -371,8 +367,6 @@ int ZEXPORT deflateReset (strm)
s = (deflate_state *)strm->state;
s->pending = 0;
s->pending_out = s->pending_buf;
- ZFREE(strm, s->class_bitmap);
- s->class_bitmap = NULL;
if (s->wrap < 0) {
s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */
@@ -823,26 +817,9 @@ int ZEXPORT deflate (strm, flush)
(flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
block_state bstate;
- if (strm->clas && s->class_bitmap == NULL) {
- /* This is the first time that we have seen alternative class
- * data. All data up till this point has been standard class. */
- s->class_bitmap = (Bytef*) ZALLOC(strm, s->w_size/4, sizeof(Byte));
- zmemzero(s->class_bitmap, s->w_size/4);
- }
-
- if (strm->clas && s->strategy == Z_RLE) {
- /* We haven't patched deflate_rle. */
- ERR_RETURN(strm, Z_BUF_ERROR);
- }
-
- if (s->strategy == Z_HUFFMAN_ONLY) {
- bstate = deflate_huff(s, flush);
- } else if (s->strategy == Z_RLE) {
- bstate = deflate_rle(s, flush);
- } else {
- bstate = (*(configuration_table[s->level].func))
- (s, flush, strm->clas);
- }
+ bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
+ (s->strategy == Z_RLE ? deflate_rle(s, flush) :
+ (*(configuration_table[s->level].func))(s, flush));
if (bstate == finish_started || bstate == finish_done) {
s->status = FINISH_STATE;
@@ -1069,57 +1046,6 @@ local void lm_init (s)
#endif
}
-/* class_set sets bits [offset,offset+len) in s->class_bitmap to either 1 (if
- * class != 0) or 0 (otherwise). */
-local void class_set(s, offset, len, clas)
- deflate_state *s;
- IPos offset;
- uInt len;
- int clas;
-{
- IPos byte = offset >> 3;
- IPos bit = offset & 7;
- Bytef class_byte_value = clas ? 0xff : 0x00;
- Bytef class_bit_value = clas ? 1 : 0;
- static const Bytef mask[8] = {0xfe, 0xfd, 0xfb, 0xf7,
- 0xef, 0xdf, 0xbf, 0x7f};
-
- if (bit) {
- while (len) {
- s->class_bitmap[byte] &= mask[bit];
- s->class_bitmap[byte] |= class_bit_value << bit;
- bit++;
- len--;
- if (bit == 8) {
- bit = 0;
- byte++;
- break;
- }
- }
- }
-
- while (len >= 8) {
- s->class_bitmap[byte++] = class_byte_value;
- len -= 8;
- }
-
- while (len) {
- s->class_bitmap[byte] &= mask[bit];
- s->class_bitmap[byte] |= class_bit_value << bit;
- bit++;
- len--;
- }
-}
-
-local int class_at(s, window_offset)
- deflate_state *s;
- IPos window_offset;
-{
- IPos byte = window_offset >> 3;
- IPos bit = window_offset & 7;
- return (s->class_bitmap[byte] >> bit) & 1;
-}
-
#ifndef FASTEST
/* ===========================================================================
* Set match_start to the longest match starting at the given string and
@@ -1134,10 +1060,9 @@ local int class_at(s, window_offset)
/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
* match.S. The code will be functionally equivalent.
*/
-local uInt longest_match(s, cur_match, clas)
+local uInt longest_match(s, cur_match)
deflate_state *s;
IPos cur_match; /* current match */
- int clas;
{
unsigned chain_length = s->max_chain_length;/* max hash chain length */
register Bytef *scan = s->window + s->strstart; /* current string */
@@ -1185,9 +1110,6 @@ local uInt longest_match(s, cur_match, clas)
do {
Assert(cur_match < s->strstart, "no future");
match = s->window + cur_match;
- /* If the matched data is in the wrong class, skip it. */
- if (s->class_bitmap && class_at(s, cur_match) != clas)
- continue;
/* Skip to next match if the match length cannot increase
* or if the match length is less than 2. Note that the checks below
@@ -1230,8 +1152,6 @@ local uInt longest_match(s, cur_match, clas)
len = (MAX_MATCH - 1) - (int)(strend-scan);
scan = strend - (MAX_MATCH-1);
-#error "UNALIGNED_OK hasn't been patched."
-
#else /* UNALIGNED_OK */
if (match[best_len] != scan_end ||
@@ -1248,23 +1168,15 @@ local uInt longest_match(s, cur_match, clas)
scan += 2, match++;
Assert(*scan == *match, "match[2]?");
- if (!s->class_bitmap) {
- /* We check for insufficient lookahead only every 8th comparison;
- * the 256th check will be made at strstart+258.
- */
- do {
- } while (*++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- scan < strend);
- } else {
- /* We have to be mindful of the class of the data and not stray. */
- do {
- } while (*++scan == *++match &&
- class_at(s, match - s->window) == clas &&
- scan < strend);
- }
+ /* We check for insufficient lookahead only every 8th comparison;
+ * the 256th check will be made at strstart+258.
+ */
+ do {
+ } while (*++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ scan < strend);
Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
@@ -1292,67 +1204,20 @@ local uInt longest_match(s, cur_match, clas)
}
#endif /* ASMV */
-/* cookie_match is a replacement for longest_match in the case of cookie data.
- * Here we only wish to match the entire value so trying the partial matches in
- * longest_match is both wasteful and often fails to find the correct match.
- *
- * So we take the djb2 hash of the cookie and look up the last position for a
- * match in a special hash table. */
-local uInt cookie_match(s, start, len)
- deflate_state *s;
- IPos start;
- unsigned len;
-{
- unsigned hash = 5381;
- Bytef *str = s->window + start;
- unsigned i;
- IPos cookie_location;
-
- if (len >= MAX_MATCH)
- return 0;
-
- for (i = 0; i < len; i++)
- hash = ((hash << 5) + hash) + str[i];
-
- hash &= Z_COOKIE_HASH_MASK;
- cookie_location = s->cookie_locations[hash];
- s->cookie_locations[hash] = start;
- s->match_start = 0;
- if (cookie_location &&
- (start - cookie_location) > len &&
- (start - cookie_location) < MAX_DIST(s) &&
- len <= s->lookahead) {
- for (i = 0; i < len; i++) {
- if (s->window[start+i] != s->window[cookie_location+i] ||
- class_at(s, cookie_location+i) != 1) {
- return 0;
- }
- }
- s->match_start = cookie_location;
- return len;
- }
-
- return 0;
-}
-
-
#else /* FASTEST */
/* ---------------------------------------------------------------------------
* Optimized version for FASTEST only
*/
-local uInt longest_match(s, cur_match, clas)
+local uInt longest_match(s, cur_match)
deflate_state *s;
IPos cur_match; /* current match */
- int clas;
{
register Bytef *scan = s->window + s->strstart; /* current string */
register Bytef *match; /* matched string */
register int len; /* length of current match */
register Bytef *strend = s->window + s->strstart + MAX_MATCH;
-#error "This code not patched"
-
/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
* It is easy to get rid of this optimization if necessary.
*/
@@ -1495,21 +1360,6 @@ local void fill_window(s)
*/
} while (--n);
#endif
-
- for (n = 0; n < Z_COOKIE_HASH_SIZE; n++) {
- if (s->cookie_locations[n] > wsize) {
- s->cookie_locations[n] -= wsize;
- } else {
- s->cookie_locations[n] = 0;
- }
- }
-
- if (s->class_bitmap) {
- zmemcpy(s->class_bitmap, s->class_bitmap + s->w_size/8,
- s->w_size/8);
- zmemzero(s->class_bitmap + s->w_size/8, s->w_size/8);
- }
-
more += wsize;
}
if (s->strm->avail_in == 0) return;
@@ -1528,9 +1378,6 @@ local void fill_window(s)
Assert(more >= 2, "more < 2");
n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
- if (s->class_bitmap != NULL) {
- class_set(s, s->strstart + s->lookahead, n, s->strm->clas);
- }
s->lookahead += n;
/* Initialize the hash value now that we have some input: */
@@ -1612,10 +1459,9 @@ local void fill_window(s)
* NOTE: this function should be optimized to avoid extra copying from
* window to pending_buf.
*/
-local block_state deflate_stored(s, flush, clas)
+local block_state deflate_stored(s, flush)
deflate_state *s;
int flush;
- int clas;
{
/* Stored blocks are limited to 0xffff bytes, pending_buf is limited
* to pending_buf_size, and each stored block has a 5 byte header:
@@ -1671,19 +1517,13 @@ local block_state deflate_stored(s, flush, clas)
* new strings in the dictionary only for unmatched strings or for short
* matches. It is used only for the fast compression options.
*/
-local block_state deflate_fast(s, flush, clas)
+local block_state deflate_fast(s, flush)
deflate_state *s;
int flush;
- int clas;
{
IPos hash_head; /* head of the hash chain */
int bflush; /* set if current block must be flushed */
- if (clas != 0) {
- /* We haven't patched this code for alternative class data. */
- return Z_BUF_ERROR;
- }
-
for (;;) {
/* Make sure that we always have enough lookahead, except
* at the end of the input file. We need MAX_MATCH bytes
@@ -1714,7 +1554,7 @@ local block_state deflate_fast(s, flush, clas)
* of window index 0 (in particular we have to avoid a match
* of the string with itself at the start of the input file).
*/
- s->match_length = longest_match (s, hash_head, clas);
+ s->match_length = longest_match (s, hash_head);
/* longest_match() sets match_start */
}
if (s->match_length >= MIN_MATCH) {
@@ -1773,25 +1613,12 @@ local block_state deflate_fast(s, flush, clas)
* evaluation for matches: a match is finally adopted only if there is
* no better match at the next window position.
*/
-local block_state deflate_slow(s, flush, clas)
+local block_state deflate_slow(s, flush)
deflate_state *s;
int flush;
- int clas;
{
IPos hash_head; /* head of hash chain */
int bflush; /* set if current block must be flushed */
- uInt input_length ;
- int first = 1; /* first says whether this is the first iteration
- of the loop, below. */
-
- if (clas == Z_CLASS_COOKIE) {
- if (s->lookahead) {
- /* Alternative class data must always be presented at the beginning
- * of a block. */
- return Z_BUF_ERROR;
- }
- input_length = s->strm->avail_in;
- }
/* Process the input block. */
for (;;) {
@@ -1821,18 +1648,13 @@ local block_state deflate_slow(s, flush, clas)
s->prev_length = s->match_length, s->prev_match = s->match_start;
s->match_length = MIN_MATCH-1;
- if (clas == Z_CLASS_COOKIE && first) {
- s->match_length = cookie_match(s, s->strstart, input_length);
- } else if (clas == Z_CLASS_STANDARD &&
- hash_head != NIL &&
- s->prev_length < s->max_lazy_match &&
- s->strstart - hash_head <= MAX_DIST(s)) {
+ if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
+ s->strstart - hash_head <= MAX_DIST(s)) {
/* To simplify the code, we prevent matches with the string
* of window index 0 (in particular we have to avoid a match
* of the string with itself at the start of the input file).
*/
- s->match_length = longest_match (s, hash_head, clas);
-
+ s->match_length = longest_match (s, hash_head);
/* longest_match() sets match_start */
if (s->match_length <= 5 && (s->strategy == Z_FILTERED
@@ -1851,22 +1673,7 @@ local block_state deflate_slow(s, flush, clas)
/* If there was a match at the previous step and the current
* match is not better, output the previous match:
*/
- first = 0;
- if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length &&
- /* We will only accept an exact match for Z_CLASS_COOKIE data and
- * we won't match Z_CLASS_HUFFMAN_ONLY data at all. */
- (clas == Z_CLASS_STANDARD || (clas == Z_CLASS_COOKIE &&
- s->prev_length == input_length &&
- s->prev_match > 0 &&
- /* We require that a Z_CLASS_COOKIE match be
- * preceded by either a semicolon (which cannot be
- * part of a cookie), or non-cookie data. This is
- * to prevent
- * a cookie from being a prefix of another.
- * spdy_framer.cc ensures that cookies are always
- * terminated by a semicolon. */
- (class_at(s, s->prev_match-1) == Z_CLASS_STANDARD ||
- *(s->window + s->prev_match-1) == ';')))) {
+ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
/* Do not insert strings in hash table beyond this. */
diff --git a/third_party/zlib/deflate.h b/third_party/zlib/deflate.h
index 83b4602..cbf0d1e 100644
--- a/third_party/zlib/deflate.h
+++ b/third_party/zlib/deflate.h
@@ -91,9 +91,6 @@ typedef unsigned IPos;
* save space in the various tables. IPos is used only for parameter passing.
*/
-#define Z_COOKIE_HASH_SIZE 64
-#define Z_COOKIE_HASH_MASK (Z_COOKIE_HASH_SIZE-1)
-
typedef struct internal_state {
z_streamp strm; /* pointer back to this zlib stream */
int status; /* as the name implies */
@@ -142,8 +139,6 @@ typedef struct internal_state {
uInt hash_mask; /* hash_size-1 */
uInt hash_shift;
- Bytef *class_bitmap; /* bitmap of class for each byte in window */
- IPos cookie_locations[Z_COOKIE_HASH_SIZE];
/* Number of bits by which ins_h must be shifted at each input
* step. It must be such that after MIN_MATCH steps, the oldest
* byte no longer takes part in the hash key, that is:
diff --git a/third_party/zlib/mixed-source.patch b/third_party/zlib/mixed-source.patch
deleted file mode 100644
index 4f7294e..0000000
--- a/third_party/zlib/mixed-source.patch
+++ /dev/null
@@ -1,469 +0,0 @@
-diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c
-index 5c4022f..e419858 100644
---- a/third_party/zlib/deflate.c
-+++ b/third_party/zlib/deflate.c
-@@ -70,14 +70,15 @@ typedef enum {
- finish_done /* finish done, accept no more input or output */
- } block_state;
-
--typedef block_state (*compress_func) OF((deflate_state *s, int flush));
-+typedef block_state (*compress_func) OF((deflate_state *s, int flush,
-+ int clas));
- /* Compression function. Returns the block state after the call. */
-
- local void fill_window OF((deflate_state *s));
--local block_state deflate_stored OF((deflate_state *s, int flush));
--local block_state deflate_fast OF((deflate_state *s, int flush));
-+local block_state deflate_stored OF((deflate_state *s, int flush, int clas));
-+local block_state deflate_fast OF((deflate_state *s, int flush, int clas));
- #ifndef FASTEST
--local block_state deflate_slow OF((deflate_state *s, int flush));
-+local block_state deflate_slow OF((deflate_state *s, int flush, int clas));
- #endif
- local block_state deflate_rle OF((deflate_state *s, int flush));
- local block_state deflate_huff OF((deflate_state *s, int flush));
-@@ -87,9 +88,9 @@ local void flush_pending OF((z_streamp strm));
- local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
- #ifdef ASMV
- void match_init OF((void)); /* asm code initialization */
-- uInt longest_match OF((deflate_state *s, IPos cur_match));
-+ uInt longest_match OF((deflate_state *s, IPos cur_match, int clas));
- #else
--local uInt longest_match OF((deflate_state *s, IPos cur_match));
-+local uInt longest_match OF((deflate_state *s, IPos cur_match, int clas));
- #endif
-
- #ifdef DEBUG
-@@ -281,6 +282,9 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
- s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
- s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
- s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
-+ s->class_bitmap = NULL;
-+ zmemzero(&s->cookie_locations, sizeof(s->cookie_locations));
-+ strm->clas = 0;
-
- s->high_water = 0; /* nothing written to s->window yet */
-
-@@ -367,6 +371,8 @@ int ZEXPORT deflateReset (strm)
- s = (deflate_state *)strm->state;
- s->pending = 0;
- s->pending_out = s->pending_buf;
-+ ZFREE(strm, s->class_bitmap);
-+ s->class_bitmap = NULL;
-
- if (s->wrap < 0) {
- s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */
-@@ -817,9 +823,26 @@ int ZEXPORT deflate (strm, flush)
- (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
- block_state bstate;
-
-- bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
-- (s->strategy == Z_RLE ? deflate_rle(s, flush) :
-- (*(configuration_table[s->level].func))(s, flush));
-+ if (strm->clas && s->class_bitmap == NULL) {
-+ /* This is the first time that we have seen alternative class
-+ * data. All data up till this point has been standard class. */
-+ s->class_bitmap = (Bytef*) ZALLOC(strm, s->w_size/4, sizeof(Byte));
-+ zmemzero(s->class_bitmap, s->w_size/4);
-+ }
-+
-+ if (strm->clas && s->strategy == Z_RLE) {
-+ /* We haven't patched deflate_rle. */
-+ ERR_RETURN(strm, Z_BUF_ERROR);
-+ }
-+
-+ if (s->strategy == Z_HUFFMAN_ONLY) {
-+ bstate = deflate_huff(s, flush);
-+ } else if (s->strategy == Z_RLE) {
-+ bstate = deflate_rle(s, flush);
-+ } else {
-+ bstate = (*(configuration_table[s->level].func))
-+ (s, flush, strm->clas);
-+ }
-
- if (bstate == finish_started || bstate == finish_done) {
- s->status = FINISH_STATE;
-@@ -1046,6 +1069,57 @@ local void lm_init (s)
- #endif
- }
-
-+/* class_set sets bits [offset,offset+len) in s->class_bitmap to either 1 (if
-+ * class != 0) or 0 (otherwise). */
-+local void class_set(s, offset, len, clas)
-+ deflate_state *s;
-+ IPos offset;
-+ uInt len;
-+ int clas;
-+{
-+ IPos byte = offset >> 3;
-+ IPos bit = offset & 7;
-+ Bytef class_byte_value = clas ? 0xff : 0x00;
-+ Bytef class_bit_value = clas ? 1 : 0;
-+ static const Bytef mask[8] = {0xfe, 0xfd, 0xfb, 0xf7,
-+ 0xef, 0xdf, 0xbf, 0x7f};
-+
-+ if (bit) {
-+ while (len) {
-+ s->class_bitmap[byte] &= mask[bit];
-+ s->class_bitmap[byte] |= class_bit_value << bit;
-+ bit++;
-+ len--;
-+ if (bit == 8) {
-+ bit = 0;
-+ byte++;
-+ break;
-+ }
-+ }
-+ }
-+
-+ while (len >= 8) {
-+ s->class_bitmap[byte++] = class_byte_value;
-+ len -= 8;
-+ }
-+
-+ while (len) {
-+ s->class_bitmap[byte] &= mask[bit];
-+ s->class_bitmap[byte] |= class_bit_value << bit;
-+ bit++;
-+ len--;
-+ }
-+}
-+
-+local int class_at(s, window_offset)
-+ deflate_state *s;
-+ IPos window_offset;
-+{
-+ IPos byte = window_offset >> 3;
-+ IPos bit = window_offset & 7;
-+ return (s->class_bitmap[byte] >> bit) & 1;
-+}
-+
- #ifndef FASTEST
- /* ===========================================================================
- * Set match_start to the longest match starting at the given string and
-@@ -1060,9 +1134,10 @@ local void lm_init (s)
- /* For 80x86 and 680x0, an optimized version will be provided in match.asm or
- * match.S. The code will be functionally equivalent.
- */
--local uInt longest_match(s, cur_match)
-+local uInt longest_match(s, cur_match, clas)
- deflate_state *s;
- IPos cur_match; /* current match */
-+ int clas;
- {
- unsigned chain_length = s->max_chain_length;/* max hash chain length */
- register Bytef *scan = s->window + s->strstart; /* current string */
-@@ -1110,6 +1185,9 @@ local uInt longest_match(s, cur_match)
- do {
- Assert(cur_match < s->strstart, "no future");
- match = s->window + cur_match;
-+ /* If the matched data is in the wrong class, skip it. */
-+ if (s->class_bitmap && class_at(s, cur_match) != clas)
-+ continue;
-
- /* Skip to next match if the match length cannot increase
- * or if the match length is less than 2. Note that the checks below
-@@ -1152,6 +1230,8 @@ local uInt longest_match(s, cur_match)
- len = (MAX_MATCH - 1) - (int)(strend-scan);
- scan = strend - (MAX_MATCH-1);
-
-+#error "UNALIGNED_OK hasn't been patched."
-+
- #else /* UNALIGNED_OK */
-
- if (match[best_len] != scan_end ||
-@@ -1168,15 +1248,23 @@ local uInt longest_match(s, cur_match)
- scan += 2, match++;
- Assert(*scan == *match, "match[2]?");
-
-- /* We check for insufficient lookahead only every 8th comparison;
-- * the 256th check will be made at strstart+258.
-- */
-- do {
-- } while (*++scan == *++match && *++scan == *++match &&
-- *++scan == *++match && *++scan == *++match &&
-- *++scan == *++match && *++scan == *++match &&
-- *++scan == *++match && *++scan == *++match &&
-- scan < strend);
-+ if (!s->class_bitmap) {
-+ /* We check for insufficient lookahead only every 8th comparison;
-+ * the 256th check will be made at strstart+258.
-+ */
-+ do {
-+ } while (*++scan == *++match && *++scan == *++match &&
-+ *++scan == *++match && *++scan == *++match &&
-+ *++scan == *++match && *++scan == *++match &&
-+ *++scan == *++match && *++scan == *++match &&
-+ scan < strend);
-+ } else {
-+ /* We have to be mindful of the class of the data and not stray. */
-+ do {
-+ } while (*++scan == *++match &&
-+ class_at(s, match - s->window) == clas &&
-+ scan < strend);
-+ }
-
- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-
-@@ -1204,20 +1292,67 @@ local uInt longest_match(s, cur_match)
- }
- #endif /* ASMV */
-
-+/* cookie_match is a replacement for longest_match in the case of cookie data.
-+ * Here we only wish to match the entire value so trying the partial matches in
-+ * longest_match is both wasteful and often fails to find the correct match.
-+ *
-+ * So we take the djb2 hash of the cookie and look up the last position for a
-+ * match in a special hash table. */
-+local uInt cookie_match(s, start, len)
-+ deflate_state *s;
-+ IPos start;
-+ unsigned len;
-+{
-+ unsigned hash = 5381;
-+ Bytef *str = s->window + start;
-+ unsigned i;
-+ IPos cookie_location;
-+
-+ if (len >= MAX_MATCH)
-+ return 0;
-+
-+ for (i = 0; i < len; i++)
-+ hash = ((hash << 5) + hash) + str[i];
-+
-+ hash &= Z_COOKIE_HASH_MASK;
-+ cookie_location = s->cookie_locations[hash];
-+ s->cookie_locations[hash] = start;
-+ s->match_start = 0;
-+ if (cookie_location &&
-+ (start - cookie_location) > len &&
-+ (start - cookie_location) < MAX_DIST(s) &&
-+ len <= s->lookahead) {
-+ for (i = 0; i < len; i++) {
-+ if (s->window[start+i] != s->window[cookie_location+i] ||
-+ class_at(s, cookie_location+i) != 1) {
-+ return 0;
-+ }
-+ }
-+ s->match_start = cookie_location;
-+ return len;
-+ }
-+
-+ return 0;
-+}
-+
-+
- #else /* FASTEST */
-
- /* ---------------------------------------------------------------------------
- * Optimized version for FASTEST only
- */
--local uInt longest_match(s, cur_match)
-+local uInt longest_match(s, cur_match, clas)
- deflate_state *s;
- IPos cur_match; /* current match */
-+ int clas;
- {
- register Bytef *scan = s->window + s->strstart; /* current string */
- register Bytef *match; /* matched string */
- register int len; /* length of current match */
- register Bytef *strend = s->window + s->strstart + MAX_MATCH;
-
-+#error "This code not patched"
-+
- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
- * It is easy to get rid of this optimization if necessary.
- */
-@@ -1360,6 +1495,21 @@ local void fill_window(s)
- */
- } while (--n);
- #endif
-+
-+ for (n = 0; n < Z_COOKIE_HASH_SIZE; n++) {
-+ if (s->cookie_locations[n] > wsize) {
-+ s->cookie_locations[n] -= wsize;
-+ } else {
-+ s->cookie_locations[n] = 0;
-+ }
-+ }
-+
-+ if (s->class_bitmap) {
-+ zmemcpy(s->class_bitmap, s->class_bitmap + s->w_size/8,
-+ s->w_size/8);
-+ zmemzero(s->class_bitmap + s->w_size/8, s->w_size/8);
-+ }
-+
- more += wsize;
- }
- if (s->strm->avail_in == 0) return;
-@@ -1378,6 +1528,9 @@ local void fill_window(s)
- Assert(more >= 2, "more < 2");
-
- n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
-+ if (s->class_bitmap != NULL) {
-+ class_set(s, s->strstart + s->lookahead, n, s->strm->clas);
-+ }
- s->lookahead += n;
-
- /* Initialize the hash value now that we have some input: */
-@@ -1459,9 +1612,10 @@ local void fill_window(s)
- * NOTE: this function should be optimized to avoid extra copying from
- * window to pending_buf.
- */
--local block_state deflate_stored(s, flush)
-+local block_state deflate_stored(s, flush, clas)
- deflate_state *s;
- int flush;
-+ int clas;
- {
- /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
- * to pending_buf_size, and each stored block has a 5 byte header:
-@@ -1517,13 +1671,19 @@ local block_state deflate_stored(s, flush)
- * new strings in the dictionary only for unmatched strings or for short
- * matches. It is used only for the fast compression options.
- */
--local block_state deflate_fast(s, flush)
-+local block_state deflate_fast(s, flush, clas)
- deflate_state *s;
- int flush;
-+ int clas;
- {
- IPos hash_head; /* head of the hash chain */
- int bflush; /* set if current block must be flushed */
-
-+ if (clas != 0) {
-+ /* We haven't patched this code for alternative class data. */
-+ return Z_BUF_ERROR;
-+ }
-+
- for (;;) {
- /* Make sure that we always have enough lookahead, except
- * at the end of the input file. We need MAX_MATCH bytes
-@@ -1554,7 +1714,7 @@ local block_state deflate_fast(s, flush)
- * of window index 0 (in particular we have to avoid a match
- * of the string with itself at the start of the input file).
- */
-- s->match_length = longest_match (s, hash_head);
-+ s->match_length = longest_match (s, hash_head, clas);
- /* longest_match() sets match_start */
- }
- if (s->match_length >= MIN_MATCH) {
-@@ -1613,12 +1773,25 @@ local block_state deflate_fast(s, flush)
- * evaluation for matches: a match is finally adopted only if there is
- * no better match at the next window position.
- */
--local block_state deflate_slow(s, flush)
-+local block_state deflate_slow(s, flush, clas)
- deflate_state *s;
- int flush;
-+ int clas;
- {
- IPos hash_head; /* head of hash chain */
- int bflush; /* set if current block must be flushed */
-+ uInt input_length ;
-+ int first = 1; /* first says whether this is the first iteration
-+ of the loop, below. */
-+
-+ if (clas == Z_CLASS_COOKIE) {
-+ if (s->lookahead) {
-+ /* Alternative class data must always be presented at the beginning
-+ * of a block. */
-+ return Z_BUF_ERROR;
-+ }
-+ input_length = s->strm->avail_in;
-+ }
-
- /* Process the input block. */
- for (;;) {
-@@ -1648,13 +1821,18 @@ local block_state deflate_slow(s, flush)
- s->prev_length = s->match_length, s->prev_match = s->match_start;
- s->match_length = MIN_MATCH-1;
-
-- if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
-- s->strstart - hash_head <= MAX_DIST(s)) {
-+ if (clas == Z_CLASS_COOKIE && first) {
-+ s->match_length = cookie_match(s, s->strstart, input_length);
-+ } else if (clas == Z_CLASS_STANDARD &&
-+ hash_head != NIL &&
-+ s->prev_length < s->max_lazy_match &&
-+ s->strstart - hash_head <= MAX_DIST(s)) {
- /* To simplify the code, we prevent matches with the string
- * of window index 0 (in particular we have to avoid a match
- * of the string with itself at the start of the input file).
- */
-- s->match_length = longest_match (s, hash_head);
-+ s->match_length = longest_match (s, hash_head, clas);
-+
- /* longest_match() sets match_start */
-
- if (s->match_length <= 5 && (s->strategy == Z_FILTERED
-@@ -1673,7 +1851,22 @@ local block_state deflate_slow(s, flush)
- /* If there was a match at the previous step and the current
- * match is not better, output the previous match:
- */
-- if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
-+ first = 0;
-+ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length &&
-+ /* We will only accept an exact match for Z_CLASS_COOKIE data and
-+ * we won't match Z_CLASS_HUFFMAN_ONLY data at all. */
-+ (clas == Z_CLASS_STANDARD || (clas == Z_CLASS_COOKIE &&
-+ s->prev_length == input_length &&
-+ s->prev_match > 0 &&
-+ /* We require that a Z_CLASS_COOKIE match be
-+ * preceded by either a semicolon (which cannot be
-+ * part of a cookie), or non-cookie data. This is
-+ * to prevent
-+ * a cookie from being a prefix of another.
-+ * spdy_framer.cc ensures that cookies are always
-+ * terminated by a semicolon. */
-+ (class_at(s, s->prev_match-1) == Z_CLASS_STANDARD ||
-+ *(s->window + s->prev_match-1) == ';')))) {
- uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
- /* Do not insert strings in hash table beyond this. */
-
-diff --git a/third_party/zlib/deflate.h b/third_party/zlib/deflate.h
-index cbf0d1e..83b4602 100644
---- a/third_party/zlib/deflate.h
-+++ b/third_party/zlib/deflate.h
-@@ -91,6 +91,9 @@ typedef unsigned IPos;
- * save space in the various tables. IPos is used only for parameter passing.
- */
-
-+#define Z_COOKIE_HASH_SIZE 64
-+#define Z_COOKIE_HASH_MASK (Z_COOKIE_HASH_SIZE-1)
-+
- typedef struct internal_state {
- z_streamp strm; /* pointer back to this zlib stream */
- int status; /* as the name implies */
-@@ -139,6 +142,8 @@ typedef struct internal_state {
- uInt hash_mask; /* hash_size-1 */
-
- uInt hash_shift;
-+ Bytef *class_bitmap; /* bitmap of class for each byte in window */
-+ IPos cookie_locations[Z_COOKIE_HASH_SIZE];
- /* Number of bits by which ins_h must be shifted at each input
- * step. It must be such that after MIN_MATCH steps, the oldest
- * byte no longer takes part in the hash key, that is:
-diff --git a/third_party/zlib/zlib.h b/third_party/zlib/zlib.h
-index 4d54af9..929f7b4 100644
---- a/third_party/zlib/zlib.h
-+++ b/third_party/zlib/zlib.h
-@@ -101,6 +101,7 @@ typedef struct z_stream_s {
- int data_type; /* best guess about the data type: binary or text */
- uLong adler; /* adler32 value of the uncompressed data */
- uLong reserved; /* reserved for future use */
-+ int clas;
- } z_stream;
-
- typedef z_stream FAR *z_streamp;
-@@ -207,6 +208,10 @@ typedef gz_header FAR *gz_headerp;
-
- #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
-
-+#define Z_CLASS_STANDARD 0
-+#define Z_CLASS_COOKIE 1
-+#define Z_CLASS_HUFFMAN_ONLY 2
-+
- #define zlib_version zlibVersion()
- /* for compatibility with versions < 1.0.2 */
-
diff --git a/third_party/zlib/zlib.gyp b/third_party/zlib/zlib.gyp
index d856897..5e4c200 100644
--- a/third_party/zlib/zlib.gyp
+++ b/third_party/zlib/zlib.gyp
@@ -5,12 +5,12 @@
{
'variables': {
'conditions': [
- [ 'OS=="none"', {
- # Because we have a patched zlib, we cannot use the system libz.
+ [ 'os_posix == 1 and OS != "mac" and OS != "ios" and OS != "openbsd"', {
+ # Link to system .so since we already use it due to GTK.
# TODO(pvalchev): OpenBSD is purposefully left out, as the system
# zlib brings up an incompatibility that breaks rendering.
'use_system_zlib%': 1,
- }, {
+ }, { # os_posix != 1 or OS == "mac" or OS == "ios" or OS == "openbsd"
'use_system_zlib%': 0,
}],
],
@@ -70,8 +70,6 @@
'sources!': [
'contrib/minizip/iowin32.c'
],
- }], ['OS=="android"', {
- 'toolsets': ['target', 'host'],
}],
],
}, {
diff --git a/third_party/zlib/zlib.h b/third_party/zlib/zlib.h
index 929f7b4..4d54af9 100644
--- a/third_party/zlib/zlib.h
+++ b/third_party/zlib/zlib.h
@@ -101,7 +101,6 @@ typedef struct z_stream_s {
int data_type; /* best guess about the data type: binary or text */
uLong adler; /* adler32 value of the uncompressed data */
uLong reserved; /* reserved for future use */
- int clas;
} z_stream;
typedef z_stream FAR *z_streamp;
@@ -208,10 +207,6 @@ typedef gz_header FAR *gz_headerp;
#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
-#define Z_CLASS_STANDARD 0
-#define Z_CLASS_COOKIE 1
-#define Z_CLASS_HUFFMAN_ONLY 2
-
#define zlib_version zlibVersion()
/* for compatibility with versions < 1.0.2 */