]> granicus.if.org Git - python/commitdiff
Closes #16183: ZipExtFile object close without file handle closed (backporting of...
authorJesus Cea <jcea@jcea.es>
Sun, 4 Nov 2012 01:32:08 +0000 (02:32 +0100)
committerJesus Cea <jcea@jcea.es>
Sun, 4 Nov 2012 01:32:08 +0000 (02:32 +0100)
Lib/zipfile.py

index 05c31438d7fdc150a2d322ee7ba82616183ce85a..87ee1948f27237b8213181e229693f4a14a0da94 100644 (file)
@@ -475,9 +475,11 @@ class ZipExtFile(io.BufferedIOBase):
     # Search for universal newlines or line chunks.
     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._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,