mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Issue #9846: ZipExtFile provides no mechanism for closing the underlying file object
This commit is contained in:
parent
022f049fed
commit
e94980a64f
1 changed files with 12 additions and 2 deletions
|
@ -473,9 +473,11 @@ class ZipExtFile(io.BufferedIOBase):
|
||||||
# Search for universal newlines or line chunks.
|
# Search for universal newlines or line chunks.
|
||||||
PATTERN = re.compile(br'^(?P<chunk>[^\r\n]+)|(?P<newline>\n|\r\n?)')
|
PATTERN = re.compile(br'^(?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
|
||||||
|
@ -647,6 +649,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().close()
|
||||||
|
|
||||||
|
|
||||||
class ZipFile:
|
class ZipFile:
|
||||||
|
@ -889,8 +897,10 @@ class ZipFile:
|
||||||
# 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 = io.open(self.filename, 'rb')
|
zef_file = io.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):
|
||||||
|
@ -944,7 +954,7 @@ class ZipFile:
|
||||||
if h[11] != check_byte:
|
if 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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue