Fix deflate stored bug when pulling last block from window.

4c7c907683
This commit is contained in:
Alex Kocharin 2022-06-10 16:52:57 +03:00
parent 14eb66909b
commit 91a1be15c2

View file

@ -517,9 +517,6 @@ const deflate_stored = (s, flush) => {
if (len > have) { if (len > have) {
len = have; /* limit len to the output */ 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 /* 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 * unable to copy all of the available input when flushing, then try
@ -528,14 +525,14 @@ const deflate_stored = (s, flush) => {
*/ */
if (len < min_block && ((len === 0 && flush !== Z_FINISH) || if (len < min_block && ((len === 0 && flush !== Z_FINISH) ||
flush === Z_NO_FLUSH || flush === Z_NO_FLUSH ||
len - left !== s.strm.avail_in)) { len !== left + s.strm.avail_in)) {
break; break;
} }
/* Make a dummy stored block in pending to get the header bytes, /* Make a dummy stored block in pending to get the header bytes,
* including any pending bits. This also updates the debugging counts. * 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, 0, 0, last); _tr_stored_block(s, 0, 0, last);
/* Replace the lengths in the dummy stored block with len. */ /* Replace the lengths in the dummy stored block with len. */
@ -547,14 +544,17 @@ const deflate_stored = (s, flush) => {
/* Write the stored block header bytes. */ /* Write the stored block header bytes. */
flush_pending(s.strm); flush_pending(s.strm);
/* Update debugging counts for the data about to be copied. */
//#ifdef ZLIB_DEBUG //#ifdef ZLIB_DEBUG
// /* Update debugging counts for the data about to be copied. */
// s->compressed_len += len << 3; // s->compressed_len += len << 3;
// s->bits_sent += len << 3; // s->bits_sent += len << 3;
//#endif //#endif
/* Copy uncompressed bytes from the window to next_out. */ /* Copy uncompressed bytes from the window to next_out. */
if (left) { if (left) {
if (left > len) {
left = len;
}
//zmemcpy(s->strm->next_out, s->window + s->block_start, left); //zmemcpy(s->strm->next_out, s->window + s->block_start, left);
s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out); s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out);
s.strm.next_out += left; s.strm.next_out += left;