aboutsummaryrefslogtreecommitdiff
path: root/deflate.c
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2017-01-21 01:50:26 -0800
committerMark Adler <madler@alumni.caltech.edu>2017-02-15 22:39:25 -0800
commit2d80d3f6b52f9fa454c26c89d2d6a1790e1cecb0 (patch)
treed9338ba447a2eea678bb7d863218ff3d40f04c2b /deflate.c
parentf9694097dd69354b03cb8af959094c7f260db0a1 (diff)
downloadzlib-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.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/deflate.c b/deflate.c
index 20bda4f..d368b25 100644
--- a/deflate.c
+++ b/deflate.c
@@ -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;