summaryrefslogtreecommitdiff
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_zipfile.py31
-rw-r--r--Lib/zipfile.py2
2 files changed, 33 insertions, 0 deletions
diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
index 49eccbb1d7..33602cff55 100644
--- a/Lib/test/test_zipfile.py
+++ b/Lib/test/test_zipfile.py
@@ -297,6 +297,36 @@ class AbstractTestsWithSourceFile:
buf = fp.read(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):
unlink(TESTFN)
unlink(TESTFN2)
@@ -393,6 +423,7 @@ class StoredTestsWithSourceFile(AbstractTestsWithSourceFile,
with zipfile.ZipFile(TESTFN2, "w") as zipfp:
self.assertRaises(ValueError, zipfp.write, TESTFN)
+
@requires_zlib
class DeflateTestsWithSourceFile(AbstractTestsWithSourceFile,
unittest.TestCase):
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index 173d99080c..12c1754d71 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -862,6 +862,8 @@ class ZipExtFile(io.BufferedIOBase):
data = self._fileobj.read(n)
self._compress_left -= len(data)
+ if not data:
+ raise EOFError
if self._decrypter is not None:
data = bytes(map(self._decrypter, data))