mirror of https://github.com/python/cpython
Issue #20078: Reading malformed zipfiles no longer hangs with 100% CPU
consumption.
This commit is contained in:
parent
78ee3289e9
commit
5ce3f10aee
|
@ -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):
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue