Issue #9759: GzipFile now raises ValueError when an operation is attempted
after the file is closed. Patch by Jeffrey Finkelstein.
This commit is contained in:
parent
cd889af917
commit
7980eaa98d
10
Lib/gzip.py
10
Lib/gzip.py
|
@ -210,6 +210,13 @@ class GzipFile(io.BufferedIOBase):
|
|||
s = repr(fileobj)
|
||||
return '<gzip ' + s[1:-1] + ' ' + hex(id(self)) + '>'
|
||||
|
||||
def _check_closed(self):
|
||||
"""Raises a ValueError if the underlying file object has been closed.
|
||||
|
||||
"""
|
||||
if self.closed:
|
||||
raise ValueError('I/O operation on closed file.')
|
||||
|
||||
def _init_write(self, filename):
|
||||
self.name = filename
|
||||
self.crc = zlib.crc32(b"") & 0xffffffff
|
||||
|
@ -288,6 +295,7 @@ class GzipFile(io.BufferedIOBase):
|
|||
self._add_read_data(uncompress)
|
||||
|
||||
def write(self,data):
|
||||
self._check_closed()
|
||||
if self.mode != WRITE:
|
||||
import errno
|
||||
raise IOError(errno.EBADF, "write() on read-only GzipFile object")
|
||||
|
@ -308,6 +316,7 @@ class GzipFile(io.BufferedIOBase):
|
|||
return len(data)
|
||||
|
||||
def read(self, size=-1):
|
||||
self._check_closed()
|
||||
if self.mode != READ:
|
||||
import errno
|
||||
raise IOError(errno.EBADF, "read() on write-only GzipFile object")
|
||||
|
@ -457,6 +466,7 @@ class GzipFile(io.BufferedIOBase):
|
|||
self.myfileobj = None
|
||||
|
||||
def flush(self,zlib_mode=zlib.Z_SYNC_FLUSH):
|
||||
self._check_closed()
|
||||
if self.mode == WRITE:
|
||||
# Ensure the compressor's buffer is flushed
|
||||
self.fileobj.write(self.compress.flush(zlib_mode))
|
||||
|
|
|
@ -62,6 +62,28 @@ class TestGzip(unittest.TestCase):
|
|||
f = gzip.GzipFile(self.filename, 'r') ; d = f.read() ; f.close()
|
||||
self.assertEqual(d, data1*50)
|
||||
|
||||
def test_io_on_closed_object(self):
|
||||
# Test that I/O operations on closed GzipFile objects raise a
|
||||
# ValueError, just like the corresponding functions on file objects.
|
||||
|
||||
# Write to a file, open it for reading, then close it.
|
||||
self.test_write()
|
||||
f = gzip.GzipFile(self.filename, 'r')
|
||||
f.close()
|
||||
with self.assertRaises(ValueError):
|
||||
f.read(1)
|
||||
with self.assertRaises(ValueError):
|
||||
f.seek(0)
|
||||
with self.assertRaises(ValueError):
|
||||
f.tell()
|
||||
# Open the file for writing, then close it.
|
||||
f = gzip.GzipFile(self.filename, 'w')
|
||||
f.close()
|
||||
with self.assertRaises(ValueError):
|
||||
f.write(b'')
|
||||
with self.assertRaises(ValueError):
|
||||
f.flush()
|
||||
|
||||
def test_append(self):
|
||||
self.test_write()
|
||||
# Append to the previous file
|
||||
|
|
Loading…
Reference in New Issue