Skip to content

Commit cac9ca8

Browse files
encukourishi93
andauthored
[3.5] bpo-39017: Avoid infinite loop in the tarfile module (GH-21454) (#21489)
Avoid infinite loop when reading specially crafted TAR files using the tarfile module (CVE-2019-20907). (cherry picked from commit 5a8d121) Co-authored-by: Rishi <[email protected]>
1 parent f52bf62 commit cac9ca8

File tree

4 files changed

+10
-0
lines changed

4 files changed

+10
-0
lines changed

Lib/tarfile.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,6 +1221,8 @@ def _proc_pax(self, tarfile):
12211221

12221222
length, keyword = match.groups()
12231223
length = int(length)
1224+
if length == 0:
1225+
raise InvalidHeaderError("invalid header")
12241226
value = buf[match.end(2) + 1:match.start(1) + length - 1]
12251227

12261228
# Normally, we could just use "utf-8" as the encoding and "strict"

Lib/test/recursion.tar

516 Bytes
Binary file not shown.

Lib/test/test_tarfile.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,13 @@ def test_premature_end_of_archive(self):
394394
with self.assertRaisesRegex(tarfile.ReadError, "unexpected end of data"):
395395
tar.extractfile(t).read()
396396

397+
def test_length_zero_header(self):
398+
# bpo-39017 (CVE-2019-20907): reading a zero-length header should fail
399+
# with an exception
400+
with self.assertRaisesRegex(tarfile.ReadError, "file could not be opened successfully"):
401+
with tarfile.open(support.findfile('recursion.tar')) as tar:
402+
pass
403+
397404
class MiscReadTestBase(CommonReadTest):
398405
def requires_name_attribute(self):
399406
pass
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Avoid infinite loop when reading specially crafted TAR files using the tarfile module (CVE-2019-20907).

0 commit comments

Comments
 (0)