summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRishi <rishi_devan@mail.com>2020-07-15 11:51:00 (GMT)
committerPetr Viktorin <pviktori@redhat.com>2020-09-29 13:59:06 (GMT)
commitfcc4a585fe13a8920fdb1f1d1ddf04eaed0025eb (patch)
tree8bd742044c3dac93fe2f191ffa7c61b1cfa3e2d7
parent76bb7970f4cb9340ac22914b27ebd3e3487964cc (diff)
downloadcpython-fedora-2.7.18-5.zip
cpython-fedora-2.7.18-5.tar.gz
cpython-fedora-2.7.18-5.tar.bz2
00351-cve-2019-20907-fix-infinite-loop-in-tarfile.patchfedora-2.7.18-5
00351 # Avoid infinite loop when reading specially crafted TAR files using the tarfile module (CVE-2019-20907). See: https://bugs.python.org/issue39017
-rw-r--r--Lib/tarfile.py2
-rw-r--r--Lib/test/recursion.tarbin0 -> 516 bytes
-rw-r--r--Lib/test/test_tarfile.py7
-rw-r--r--Misc/NEWS.d/next/Library/2020-07-12-22-16-58.bpo-39017.x3Cg-9.rst1
4 files changed, 10 insertions, 0 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index adf91d5..574a6bb 100644
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -1400,6 +1400,8 @@ class TarInfo(object):
length, keyword = match.groups()
length = int(length)
+ if length == 0:
+ raise InvalidHeaderError("invalid header")
value = buf[match.end(2) + 1:match.start(1) + length - 1]
keyword = keyword.decode("utf8")
diff --git a/Lib/test/recursion.tar b/Lib/test/recursion.tar
new file mode 100644
index 0000000..b823725
--- /dev/null
+++ b/Lib/test/recursion.tar
Binary files differ
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index 89bd738..4592156 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -325,6 +325,13 @@ class CommonReadTest(ReadTest):
class MiscReadTest(CommonReadTest):
taropen = tarfile.TarFile.taropen
+ def test_length_zero_header(self):
+ # bpo-39017 (CVE-2019-20907): reading a zero-length header should fail
+ # with an exception
+ with self.assertRaisesRegexp(tarfile.ReadError, "file could not be opened successfully"):
+ with tarfile.open(support.findfile('recursion.tar')) as tar:
+ pass
+
def test_no_name_argument(self):
with open(self.tarname, "rb") as fobj:
tar = tarfile.open(fileobj=fobj, mode=self.mode)
diff --git a/Misc/NEWS.d/next/Library/2020-07-12-22-16-58.bpo-39017.x3Cg-9.rst b/Misc/NEWS.d/next/Library/2020-07-12-22-16-58.bpo-39017.x3Cg-9.rst
new file mode 100644
index 0000000..ad26676
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-07-12-22-16-58.bpo-39017.x3Cg-9.rst
@@ -0,0 +1 @@
+Avoid infinite loop when reading specially crafted TAR files using the tarfile module (CVE-2019-20907).