Issue #20078: Reading malformed zipfiles no longer hangs with 100% CPU

consumption.
This commit is contained in:
Serhiy Storchaka 2014-01-09 14:50:20 +02:00
parent 78ee3289e9
commit 5ce3f10aee
3 changed files with 36 additions and 0 deletions

View File

@ -293,6 +293,36 @@ class AbstractTestsWithSourceFile:
buf = fp.read(test_size) buf = fp.read(test_size)
self.assertEqual(len(buf), test_size) self.assertEqual(len(buf), test_size)
def test_truncated_zipfile(self):
fp = io.BytesIO()
with zipfile.ZipFile(fp, mode='w') as zipf:
zipf.writestr('strfile', self.data, compress_type=self.compression)
end_offset = fp.tell()
zipfiledata = fp.getvalue()
fp = io.BytesIO(zipfiledata)
with zipfile.ZipFile(fp) as zipf:
with zipf.open('strfile') as zipopen:
fp.truncate(end_offset - 20)
with self.assertRaises(EOFError):
zipopen.read()
fp = io.BytesIO(zipfiledata)
with zipfile.ZipFile(fp) as zipf:
with zipf.open('strfile') as zipopen:
fp.truncate(end_offset - 20)
with self.assertRaises(EOFError):
while zipopen.read(100):
pass
fp = io.BytesIO(zipfiledata)
with zipfile.ZipFile(fp) as zipf:
with zipf.open('strfile') as zipopen:
fp.truncate(end_offset - 20)
with self.assertRaises(EOFError):
while zipopen.read1(100):
pass
def tearDown(self): def tearDown(self):
unlink(TESTFN) unlink(TESTFN)
unlink(TESTFN2) unlink(TESTFN2)
@ -389,6 +419,7 @@ class StoredTestsWithSourceFile(AbstractTestsWithSourceFile,
with zipfile.ZipFile(TESTFN2, "w") as zipfp: with zipfile.ZipFile(TESTFN2, "w") as zipfp:
self.assertRaises(ValueError, zipfp.write, TESTFN) self.assertRaises(ValueError, zipfp.write, TESTFN)
@requires_zlib @requires_zlib
class DeflateTestsWithSourceFile(AbstractTestsWithSourceFile, class DeflateTestsWithSourceFile(AbstractTestsWithSourceFile,
unittest.TestCase): unittest.TestCase):

View File

@ -860,6 +860,8 @@ class ZipExtFile(io.BufferedIOBase):
data = self._fileobj.read(n) data = self._fileobj.read(n)
self._compress_left -= len(data) self._compress_left -= len(data)
if not data:
raise EOFError
if self._decrypter is not None: if self._decrypter is not None:
data = bytes(map(self._decrypter, data)) data = bytes(map(self._decrypter, data))

View File

@ -36,6 +36,9 @@ Core and Builtins
Library Library
------- -------
- Issue #20078: Reading malformed zipfiles no longer hangs with 100% CPU
consumption.
- Issue #20113: os.readv() and os.writev() now raise an OSError exception on - Issue #20113: os.readv() and os.writev() now raise an OSError exception on
error instead of returning -1. error instead of returning -1.