Commit 93d628b3 authored by Jesus Cea's avatar Jesus Cea

Closes #16183: ZipExtFile object close without file handle closed (backporting of Issue #9846)

parent 146a5fea
...@@ -475,9 +475,11 @@ class ZipExtFile(io.BufferedIOBase): ...@@ -475,9 +475,11 @@ class ZipExtFile(io.BufferedIOBase):
# Search for universal newlines or line chunks. # Search for universal newlines or line chunks.
PATTERN = re.compile(r'^(?P<chunk>[^\r\n]+)|(?P<newline>\n|\r\n?)') PATTERN = re.compile(r'^(?P<chunk>[^\r\n]+)|(?P<newline>\n|\r\n?)')
def __init__(self, fileobj, mode, zipinfo, decrypter=None): def __init__(self, fileobj, mode, zipinfo, decrypter=None,
close_fileobj=False):
self._fileobj = fileobj self._fileobj = fileobj
self._decrypter = decrypter self._decrypter = decrypter
self._close_fileobj = close_fileobj
self._compress_type = zipinfo.compress_type self._compress_type = zipinfo.compress_type
self._compress_size = zipinfo.compress_size self._compress_size = zipinfo.compress_size
...@@ -649,6 +651,12 @@ class ZipExtFile(io.BufferedIOBase): ...@@ -649,6 +651,12 @@ class ZipExtFile(io.BufferedIOBase):
self._offset += len(data) self._offset += len(data)
return data return data
def close(self):
try :
if self._close_fileobj:
self._fileobj.close()
finally:
super(ZipExtFile, self).close()
class ZipFile(object): class ZipFile(object):
...@@ -896,8 +904,10 @@ class ZipFile(object): ...@@ -896,8 +904,10 @@ class ZipFile(object):
# given a file object in the constructor # given a file object in the constructor
if self._filePassed: if self._filePassed:
zef_file = self.fp zef_file = self.fp
should_close = False
else: else:
zef_file = open(self.filename, 'rb') zef_file = open(self.filename, 'rb')
should_close = True
# Make sure we have an info object # Make sure we have an info object
if isinstance(name, ZipInfo): if isinstance(name, ZipInfo):
...@@ -951,7 +961,8 @@ class ZipFile(object): ...@@ -951,7 +961,8 @@ class ZipFile(object):
if ord(h[11]) != check_byte: if ord(h[11]) != check_byte:
raise RuntimeError("Bad password for file", name) raise RuntimeError("Bad password for file", name)
return ZipExtFile(zef_file, mode, zinfo, zd) return ZipExtFile(zef_file, mode, zinfo, zd,
close_fileobj=should_close)
def extract(self, member, path=None, pwd=None): def extract(self, member, path=None, pwd=None):
"""Extract a member from the archive to the current working directory, """Extract a member from the archive to the current working directory,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment