Skip to content

Commit aa5c3e0

Browse files
committed
bpo-37523: Raise ValueError for I/O operations on a closed zipfile.ZipExtFile
Raises `ValueError`when calling the following on a closed `zipfile.ZipExtFile`: - `read` - `readable` - `seek` - `seekable` - `tell`
1 parent 38f44b4 commit aa5c3e0

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

Lib/test/test_zipfile.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,20 @@ def test_write_default_name(self):
567567
with open(TESTFN, "rb") as f:
568568
self.assertEqual(zipfp.read(TESTFN), f.read())
569569

570+
def test_io_on_closed_zipextfile(self):
571+
fname = "somefile.txt"
572+
with zipfile.ZipFile(TESTFN2, mode="w") as zipfp:
573+
zipfp.writestr(fname, "bogus")
574+
575+
with zipfile.ZipFile(TESTFN2, mode="r") as zipfp:
576+
with zipfp.open(fname) as fid:
577+
fid.close()
578+
self.assertRaises(ValueError, fid.read)
579+
self.assertRaises(ValueError, fid.seek, 0)
580+
self.assertRaises(ValueError, fid.tell)
581+
self.assertRaises(ValueError, fid.readable)
582+
self.assertRaises(ValueError, fid.seekable)
583+
570584
def test_write_to_readonly(self):
571585
"""Check that trying to call write() on a readonly ZipFile object
572586
raises a ValueError."""

Lib/zipfile.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -877,12 +877,16 @@ def peek(self, n=1):
877877
return self._readbuffer[self._offset: self._offset + 512]
878878

879879
def readable(self):
880+
if self.closed:
881+
raise ValueError("I/O operation on closed file.")
880882
return True
881883

882884
def read(self, n=-1):
883885
"""Read and return up to n bytes.
884886
If the argument is omitted, None, or negative, data is read and returned until EOF is reached.
885887
"""
888+
if self.closed:
889+
raise ValueError("read from closed file.")
886890
if n is None or n < 0:
887891
buf = self._readbuffer[self._offset:]
888892
self._readbuffer = b''
@@ -1019,9 +1023,13 @@ def close(self):
10191023
super().close()
10201024

10211025
def seekable(self):
1026+
if self.closed:
1027+
raise ValueError("I/O operation on closed file.")
10221028
return self._seekable
10231029

10241030
def seek(self, offset, whence=0):
1031+
if self.closed:
1032+
raise ValueError("seek on closed file.")
10251033
if not self._seekable:
10261034
raise io.UnsupportedOperation("underlying stream is not seekable")
10271035
curr_pos = self.tell()
@@ -1068,6 +1076,8 @@ def seek(self, offset, whence=0):
10681076
return self.tell()
10691077

10701078
def tell(self):
1079+
if self.closed:
1080+
raise ValueError("tell on closed file.")
10711081
if not self._seekable:
10721082
raise io.UnsupportedOperation("underlying stream is not seekable")
10731083
filepos = self._orig_file_size - self._left - len(self._readbuffer) + self._offset

0 commit comments

Comments
 (0)