From: Mark Adler Date: Sat, 21 Jan 2017 09:50:26 +0000 (-0800) Subject: Limit hash table inserts after switch from stored deflate. X-Git-Tag: 1.9.9-b1~561 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34c3661e9200c7cefa29d274b7adc9f9ebbc5faf;p=thirdparty%2Fzlib-ng.git Limit hash table inserts after switch from stored deflate. This limits hash table inserts to the available data in the window and to the sliding window size in deflate_stored(). The hash table inserts are deferred until deflateParams() switches to a non-zero compression level. --- diff --git a/deflate.c b/deflate.c index fc48a31d..9746302e 100644 --- a/deflate.c +++ b/deflate.c @@ -1248,7 +1248,8 @@ void ZLIB_INTERNAL fill_window_c(deflate_state *s) { s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; - + if (s->insert > s->strstart) + s->insert = s->strstart; slide_hash(s); more += wsize; } @@ -1451,6 +1452,7 @@ static block_state deflate_stored(deflate_state *s, int flush) { s->matches = 2; /* clear hash */ memcpy(s->window, s->strm->next_in - s->w_size, s->w_size); s->strstart = s->w_size; + s->insert = s->strstart; } else { if (s->window_size - s->strstart <= used) { @@ -1459,12 +1461,14 @@ static block_state deflate_stored(deflate_state *s, int flush) { memcpy(s->window, s->window + s->w_size, s->strstart); if (s->matches < 2) s->matches++; /* add a pending slide_hash() */ + if (s->insert > s->strstart) + s->insert = s->strstart; } memcpy(s->window + s->strstart, s->strm->next_in - used, used); s->strstart += used; + s->insert += MIN(used, s->w_size - s->insert); } s->block_start = s->strstart; - s->insert += MIN(used, s->w_size - s->insert); } if (s->high_water < s->strstart) s->high_water = s->strstart; @@ -1488,12 +1492,15 @@ static block_state deflate_stored(deflate_state *s, int flush) { if (s->matches < 2) s->matches++; /* add a pending slide_hash() */ have += s->w_size; /* more space now */ + if (s->insert > s->strstart) + s->insert = s->strstart; } if (have > s->strm->avail_in) have = s->strm->avail_in; if (have) { read_buf(s->strm, s->window + s->strstart, have); s->strstart += have; + s->insert += MIN(have, s->w_size - s->insert); } if (s->high_water < s->strstart) s->high_water = s->strstart;