bpo-39017: Avoid infinite loop in the tarfile module (GH-21454)
Avoid infinite loop when reading specially crafted TAR files using the tarfile module (CVE-2019-20907).
This commit is contained in:
parent
bbceef6851
commit
5a8d121a1f
|
@ -1249,6 +1249,8 @@ class TarInfo(object):
|
||||||
|
|
||||||
length, keyword = match.groups()
|
length, keyword = match.groups()
|
||||||
length = int(length)
|
length = int(length)
|
||||||
|
if length == 0:
|
||||||
|
raise InvalidHeaderError("invalid header")
|
||||||
value = buf[match.end(2) + 1:match.start(1) + length - 1]
|
value = buf[match.end(2) + 1:match.start(1) + length - 1]
|
||||||
|
|
||||||
# Normally, we could just use "utf-8" as the encoding and "strict"
|
# Normally, we could just use "utf-8" as the encoding and "strict"
|
||||||
|
|
Binary file not shown.
|
@ -429,6 +429,13 @@ class CommonReadTest(ReadTest):
|
||||||
with self.assertRaisesRegex(tarfile.ReadError, "unexpected end of data"):
|
with self.assertRaisesRegex(tarfile.ReadError, "unexpected end of data"):
|
||||||
tar.extractfile(t).read()
|
tar.extractfile(t).read()
|
||||||
|
|
||||||
|
def test_length_zero_header(self):
|
||||||
|
# bpo-39017 (CVE-2019-20907): reading a zero-length header should fail
|
||||||
|
# with an exception
|
||||||
|
with self.assertRaisesRegex(tarfile.ReadError, "file could not be opened successfully"):
|
||||||
|
with tarfile.open(support.findfile('recursion.tar')) as tar:
|
||||||
|
pass
|
||||||
|
|
||||||
class MiscReadTestBase(CommonReadTest):
|
class MiscReadTestBase(CommonReadTest):
|
||||||
def requires_name_attribute(self):
|
def requires_name_attribute(self):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Avoid infinite loop when reading specially crafted TAR files using the tarfile module (CVE-2019-20907).
|
Loading…
Reference in New Issue