diff options
author | Mark Adler <madler@alumni.caltech.edu> | 2017-01-21 01:50:26 -0800 |
---|---|---|
committer | Mark Adler <madler@alumni.caltech.edu> | 2017-02-15 22:39:25 -0800 |
commit | 2d80d3f6b52f9fa454c26c89d2d6a1790e1cecb0 (patch) | |
tree | d9338ba447a2eea678bb7d863218ff3d40f04c2b /deflate.c | |
parent | f9694097dd69354b03cb8af959094c7f260db0a1 (diff) | |
download | zlib-2d80d3f6b52f9fa454c26c89d2d6a1790e1cecb0.tar.gz zlib-2d80d3f6b52f9fa454c26c89d2d6a1790e1cecb0.tar.bz2 zlib-2d80d3f6b52f9fa454c26c89d2d6a1790e1cecb0.zip |
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.
Diffstat (limited to 'deflate.c')
-rw-r--r-- | deflate.c | 10 |
1 files changed, 9 insertions, 1 deletions
@@ -1513,6 +1513,8 @@ local void fill_window(s) | |||
1513 | s->match_start -= wsize; | 1513 | s->match_start -= wsize; |
1514 | s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ | 1514 | s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ |
1515 | s->block_start -= (long) wsize; | 1515 | s->block_start -= (long) wsize; |
1516 | if (s->insert > s->strstart) | ||
1517 | s->insert = s->strstart; | ||
1516 | slide_hash(s); | 1518 | slide_hash(s); |
1517 | more += wsize; | 1519 | more += wsize; |
1518 | } | 1520 | } |
@@ -1742,6 +1744,7 @@ local block_state deflate_stored(s, flush) | |||
1742 | s->matches = 2; /* clear hash */ | 1744 | s->matches = 2; /* clear hash */ |
1743 | zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); | 1745 | zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); |
1744 | s->strstart = s->w_size; | 1746 | s->strstart = s->w_size; |
1747 | s->insert = s->strstart; | ||
1745 | } | 1748 | } |
1746 | else { | 1749 | else { |
1747 | if (s->window_size - s->strstart <= used) { | 1750 | if (s->window_size - s->strstart <= used) { |
@@ -1750,12 +1753,14 @@ local block_state deflate_stored(s, flush) | |||
1750 | zmemcpy(s->window, s->window + s->w_size, s->strstart); | 1753 | zmemcpy(s->window, s->window + s->w_size, s->strstart); |
1751 | if (s->matches < 2) | 1754 | if (s->matches < 2) |
1752 | s->matches++; /* add a pending slide_hash() */ | 1755 | s->matches++; /* add a pending slide_hash() */ |
1756 | if (s->insert > s->strstart) | ||
1757 | s->insert = s->strstart; | ||
1753 | } | 1758 | } |
1754 | zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); | 1759 | zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); |
1755 | s->strstart += used; | 1760 | s->strstart += used; |
1761 | s->insert += MIN(used, s->w_size - s->insert); | ||
1756 | } | 1762 | } |
1757 | s->block_start = s->strstart; | 1763 | s->block_start = s->strstart; |
1758 | s->insert += MIN(used, s->w_size - s->insert); | ||
1759 | } | 1764 | } |
1760 | if (s->high_water < s->strstart) | 1765 | if (s->high_water < s->strstart) |
1761 | s->high_water = s->strstart; | 1766 | s->high_water = s->strstart; |
@@ -1779,12 +1784,15 @@ local block_state deflate_stored(s, flush) | |||
1779 | if (s->matches < 2) | 1784 | if (s->matches < 2) |
1780 | s->matches++; /* add a pending slide_hash() */ | 1785 | s->matches++; /* add a pending slide_hash() */ |
1781 | have += s->w_size; /* more space now */ | 1786 | have += s->w_size; /* more space now */ |
1787 | if (s->insert > s->strstart) | ||
1788 | s->insert = s->strstart; | ||
1782 | } | 1789 | } |
1783 | if (have > s->strm->avail_in) | 1790 | if (have > s->strm->avail_in) |
1784 | have = s->strm->avail_in; | 1791 | have = s->strm->avail_in; |
1785 | if (have) { | 1792 | if (have) { |
1786 | read_buf(s->strm, s->window + s->strstart, have); | 1793 | read_buf(s->strm, s->window + s->strstart, have); |
1787 | s->strstart += have; | 1794 | s->strstart += have; |
1795 | s->insert += MIN(have, s->w_size - s->insert); | ||
1788 | } | 1796 | } |
1789 | if (s->high_water < s->strstart) | 1797 | if (s->high_water < s->strstart) |
1790 | s->high_water = s->strstart; | 1798 | s->high_water = s->strstart; |