mirror of
https://github.com/python/cpython.git
synced 2025-11-13 23:46:24 +00:00
bpo-39039: tarfile raises descriptive exception from zlib.error (GH-27766)
* during tarfile parsing, a zlib error indicates invalid data * tarfile.open now raises a descriptive exception from the zlib error * this makes it clear to the user that they may be trying to open a corrupted tar file
This commit is contained in:
parent
233b9da07d
commit
b6fe857250
3 changed files with 25 additions and 0 deletions
|
|
@ -2349,6 +2349,15 @@ class TarFile(object):
|
||||||
raise ReadError(str(e)) from None
|
raise ReadError(str(e)) from None
|
||||||
except SubsequentHeaderError as e:
|
except SubsequentHeaderError as e:
|
||||||
raise ReadError(str(e)) from None
|
raise ReadError(str(e)) from None
|
||||||
|
except Exception as e:
|
||||||
|
try:
|
||||||
|
import zlib
|
||||||
|
if isinstance(e, zlib.error):
|
||||||
|
raise ReadError(f'zlib error: {e}') from None
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
except ImportError:
|
||||||
|
raise e
|
||||||
break
|
break
|
||||||
|
|
||||||
if tarinfo is not None:
|
if tarinfo is not None:
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,10 @@ try:
|
||||||
import gzip
|
import gzip
|
||||||
except ImportError:
|
except ImportError:
|
||||||
gzip = None
|
gzip = None
|
||||||
|
try:
|
||||||
|
import zlib
|
||||||
|
except ImportError:
|
||||||
|
zlib = None
|
||||||
try:
|
try:
|
||||||
import bz2
|
import bz2
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
|
@ -687,6 +691,16 @@ class MiscReadTestBase(CommonReadTest):
|
||||||
self.assertEqual(m1.offset, m2.offset)
|
self.assertEqual(m1.offset, m2.offset)
|
||||||
self.assertEqual(m1.get_info(), m2.get_info())
|
self.assertEqual(m1.get_info(), m2.get_info())
|
||||||
|
|
||||||
|
@unittest.skipIf(zlib is None, "requires zlib")
|
||||||
|
def test_zlib_error_does_not_leak(self):
|
||||||
|
# bpo-39039: tarfile.open allowed zlib exceptions to bubble up when
|
||||||
|
# parsing certain types of invalid data
|
||||||
|
with unittest.mock.patch("tarfile.TarInfo.fromtarfile") as mock:
|
||||||
|
mock.side_effect = zlib.error
|
||||||
|
with self.assertRaises(tarfile.ReadError):
|
||||||
|
tarfile.open(self.tarname)
|
||||||
|
|
||||||
|
|
||||||
class MiscReadTest(MiscReadTestBase, unittest.TestCase):
|
class MiscReadTest(MiscReadTestBase, unittest.TestCase):
|
||||||
test_fail_comp = None
|
test_fail_comp = None
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
tarfile.open raises :exc:`~tarfile.ReadError` when a zlib error occurs
|
||||||
|
during file extraction.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue