diff options
author | Mark Adler <madler@alumni.caltech.edu> | 2017-01-12 21:51:20 -0800 |
---|---|---|
committer | Mark Adler <madler@alumni.caltech.edu> | 2017-01-15 09:07:14 -0800 |
commit | 4c7c90768308587884fab6159d93a4695a5ab1f0 (patch) | |
tree | d94773ee823574c484d4e93e669fe40f84b1ed22 /deflate.c | |
parent | 74d2696d87188f52296ee9c88f295eb0d896acf9 (diff) | |
download | zlib-4c7c90768308587884fab6159d93a4695a5ab1f0.tar.gz |
Fix deflate stored bug when pulling last block from window.
And some cosmetic cleanups.
Diffstat (limited to 'deflate.c')
-rw-r--r-- | deflate.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -1671,8 +1671,6 @@ local block_state deflate_stored(s, flush) len = left + s->strm->avail_in; /* limit len to the input */ if (len > have) len = have; /* limit len to the output */ - if (left > len) - left = len; /* limit window pull to len */ /* If the stored block would be less than min_block in length, or if * unable to copy all of the available input when flushing, then try @@ -1681,13 +1679,13 @@ local block_state deflate_stored(s, flush) */ if (len < min_block && ((len == 0 && flush != Z_FINISH) || flush == Z_NO_FLUSH || - len - left != s->strm->avail_in)) + len != left + s->strm->avail_in)) break; /* Make a dummy stored block in pending to get the header bytes, * including any pending bits. This also updates the debugging counts. */ - last = flush == Z_FINISH && len - left == s->strm->avail_in ? 1 : 0; + last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0; _tr_stored_block(s, (char *)0, 0L, last); /* Replace the lengths in the dummy stored block with len. */ @@ -1699,14 +1697,16 @@ local block_state deflate_stored(s, flush) /* Write the stored block header bytes. */ flush_pending(s->strm); - /* Update debugging counts for the data about to be copied. */ #ifdef ZLIB_DEBUG + /* Update debugging counts for the data about to be copied. */ s->compressed_len += len << 3; s->bits_sent += len << 3; #endif /* Copy uncompressed bytes from the window to next_out. */ if (left) { + if (left > len) + left = len; zmemcpy(s->strm->next_out, s->window + s->block_start, left); s->strm->next_out += left; s->strm->avail_out -= left; |