Skip to content

Commit 5f97915

Browse files
committed
gh-158169: Clear unconsumed_tail at EOF
1 parent 68d86eb commit 5f97915

3 files changed

Lines changed: 16 additions & 0 deletions

File tree

‎Lib/test/test_zlib.py‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,18 @@ def test_decompress_unused_data(self):
822822
self.assertEqual(dco.unconsumed_tail, b'')
823823
self.assertEqual(dco.unused_data, remainder)
824824

825+
def test_decompress_unconsumed_tail_after_eof(self):
826+
source = bytes(range(256)) * 4
827+
remainder = b'extra'
828+
dco = zlib.decompressobj()
829+
chunks = [dco.decompress(zlib.compress(source) + remainder, 100)]
830+
while not dco.eof:
831+
chunks.append(dco.decompress(dco.unconsumed_tail, 100))
832+
833+
self.assertEqual(b''.join(chunks), source)
834+
self.assertEqual(dco.unconsumed_tail, b'')
835+
self.assertEqual(dco.unused_data, remainder)
836+
825837
# issue27164
826838
def test_decompress_raw_with_dictionary(self):
827839
zdict = b'abcdefghijklmnopqrstuvwxyz'
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Clear ``Decompress.unconsumed_tail`` once decompression reaches EOF. Trailing
2+
input is available only through ``Decompress.unused_data``.

‎Modules/zlibmodule.c‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,8 @@ save_unconsumed_input(compobject *self, Py_buffer *data, int err)
838838
return -1;
839839
}
840840
Py_SETREF(self->unused_data, new_unused_data);
841+
/* These bytes are now in unused_data, not unconsumed_tail. */
842+
self->zst.next_in += left_size;
841843
self->zst.avail_in = 0;
842844
}
843845
}

0 commit comments

Comments
 (0)