You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.8 KiB
78 lines
2.8 KiB
From cb33ceb1b0ec5ec1cf8cb8239ea2705508501afc Mon Sep 17 00:00:00 2001 |
|
From: Rishi <rishi_devan@mail.com> |
|
Date: Wed, 15 Jul 2020 13:51:00 +0200 |
|
Subject: [PATCH] 00351-cve-2019-20907-fix-infinite-loop-in-tarfile.patch |
|
|
|
00351 # |
|
Avoid infinite loop when reading specially crafted TAR files using the tarfile module |
|
(CVE-2019-20907). |
|
See: https://bugs.python.org/issue39017 |
|
--- |
|
Lib/tarfile.py | 2 ++ |
|
Lib/test/recursion.tar | Bin 0 -> 516 bytes |
|
Lib/test/test_tarfile.py | 8 ++++++++ |
|
.../2020-07-12-22-16-58.bpo-39017.x3Cg-9.rst | 1 + |
|
4 files changed, 11 insertions(+) |
|
create mode 100644 Lib/test/recursion.tar |
|
create mode 100644 Misc/NEWS.d/next/Library/2020-07-12-22-16-58.bpo-39017.x3Cg-9.rst |
|
|
|
diff --git a/Lib/tarfile.py b/Lib/tarfile.py |
|
index 16a6e86..ddddc1b 100644 |
|
--- a/Lib/tarfile.py |
|
+++ b/Lib/tarfile.py |
|
@@ -1388,6 +1388,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 0000000000000000000000000000000000000000..b8237251964983f54ed1966297e887636cd0c5f4 |
|
GIT binary patch |
|
literal 516 |
|
zcmYdFPRz+kEn=W0Fn}74P8%Xw3X=l~85kIuo0>8xq$A1Gm}!7)KUsFc41m#O8A5+e |
|
I1_}|j06>QaCIA2c |
|
|
|
literal 0 |
|
HcmV?d00001 |
|
|
|
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py |
|
index 69d342a..9aa6ea6 100644 |
|
--- a/Lib/test/test_tarfile.py |
|
+++ b/Lib/test/test_tarfile.py |
|
@@ -11,6 +11,7 @@ import unittest |
|
import tarfile |
|
|
|
from test import test_support |
|
+from test import test_support as support |
|
|
|
# Check for our compression modules. |
|
try: |
|
@@ -206,6 +207,13 @@ class CommonReadTest(ReadTest): |
|
|
|
class MiscReadTest(CommonReadTest): |
|
|
|
+ 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): |
|
fobj = open(self.tarname, "rb") |
|
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). |
|
-- |
|
2.26.2 |
|
|
|
|