Fix #11513: wrong exception handling for the case that GzipFile itself raises an IOError.

This commit is contained in:
Georg Brandl 2011-08-13 11:48:12 +02:00
parent 963e40256a
commit 3abb372c81
3 changed files with 15 additions and 2 deletions

View file

@ -1804,11 +1804,13 @@ def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj)
t = cls.taropen(name, mode, fileobj, **kwargs)
except IOError:
if not extfileobj:
if not extfileobj and fileobj is not None:
fileobj.close()
if fileobj is None:
raise
raise ReadError("not a gzip file")
except:
if not extfileobj:
if not extfileobj and fileobj is not None:
fileobj.close()
raise
t._extfileobj = extfileobj

View file

@ -1682,6 +1682,14 @@ def test_symlink_extraction2(self):
class GzipMiscReadTest(MiscReadTest):
tarname = gzipname
mode = "r:gz"
def test_non_existent_targz_file(self):
# Test for issue11513: prevent non-existent gzipped tarfiles raising
# multiple exceptions.
with self.assertRaisesRegex(IOError, "xxx") as ex:
tarfile.open("xxx", self.mode)
self.assertEqual(ex.exception.errno, errno.ENOENT)
class GzipUstarReadTest(UstarReadTest):
tarname = gzipname
mode = "r:gz"

View file

@ -44,6 +44,9 @@ Core and Builtins
Library
-------
- Issue #11513: Fix exception handling ``tarfile.TarFile.gzopen()`` when
the file cannot be opened.
- Issue #12687: Fix a possible buffering bug when unpickling text mode
(protocol 0, mostly) pickles.