From: Jesus Cea Date: Sun, 4 Nov 2012 01:32:08 +0000 (+0100) Subject: Closes #16183: ZipExtFile object close without file handle closed (backporting of... X-Git-Tag: v2.7.5~109^2~152 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=93d628b3780900f42e1d4c36cbeb0f5db3781198;p=python Closes #16183: ZipExtFile object close without file handle closed (backporting of Issue #9846) --- diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 05c31438d7..87ee1948f2 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -475,9 +475,11 @@ class ZipExtFile(io.BufferedIOBase): # Search for universal newlines or line chunks. PATTERN = re.compile(r'^(?P[^\r\n]+)|(?P\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._decrypter = decrypter + self._close_fileobj = close_fileobj self._compress_type = zipinfo.compress_type self._compress_size = zipinfo.compress_size @@ -649,6 +651,12 @@ class ZipExtFile(io.BufferedIOBase): self._offset += len(data) return data + def close(self): + try : + if self._close_fileobj: + self._fileobj.close() + finally: + super(ZipExtFile, self).close() class ZipFile(object): @@ -896,8 +904,10 @@ class ZipFile(object): # given a file object in the constructor if self._filePassed: zef_file = self.fp + should_close = False else: zef_file = open(self.filename, 'rb') + should_close = True # Make sure we have an info object if isinstance(name, ZipInfo): @@ -951,7 +961,8 @@ class ZipFile(object): if ord(h[11]) != check_byte: 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): """Extract a member from the archive to the current working directory,