mirror of
https://git.yoctoproject.org/poky
synced 2026-07-29 04:17:45 +02:00
python3: fix CVE-2026-11972
When using the "tarfile" module with a file opened in "streaming mode" (mode="r|") the tarfile module did not properly handle EOF, making archive parsing take exponentially longer. (From OE-Core rev: 9c066bcd634e7b938a10c64ef1eaf322a99ec434) Signed-off-by: Benjamin Robin (Schneider Electric) <benjamin.robin@bootlin.com> Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> (cherry picked from commit bbd9c82298880ab61b9befea97dfe8a0a4943836) Signed-off-by: Yoann Congal <yoann.congal@smile.fr> Signed-off-by: Paul Barker <paul@pbarker.dev>
This commit is contained in:
committed by
Paul Barker
parent
ca405952dc
commit
96f1bb2af7
60
meta/recipes-devtools/python/python3/CVE-2026-11972.patch
Normal file
60
meta/recipes-devtools/python/python3/CVE-2026-11972.patch
Normal file
@@ -0,0 +1,60 @@
|
||||
From a83ebdb495a9cbd28a03675acdeda235fade90b3 Mon Sep 17 00:00:00 2001
|
||||
From: Petr Viktorin <encukou@gmail.com>
|
||||
Date: Tue, 23 Jun 2026 15:13:30 +0200
|
||||
Subject: [PATCH] gh-151981: Make tarfile._Stream.seek break at EOF (GH-151982)
|
||||
|
||||
Co-authored-by: Stan Ulbrych <stan@python.org>
|
||||
|
||||
CVE: CVE-2026-11972
|
||||
Upstream-Status: Backport [https://github.com/python/cpython/commit/f50bf13566189c8d0ce5a814f33eff3d89951896]
|
||||
|
||||
Signed-off-by: Benjamin Robin <benjamin.robin@bootlin.com>
|
||||
---
|
||||
Lib/tarfile.py | 4 +++-
|
||||
Lib/test/test_tarfile.py | 16 ++++++++++++++++
|
||||
2 files changed, 19 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
|
||||
index 83226e907e4b..c0007a78f700 100755
|
||||
--- a/Lib/tarfile.py
|
||||
+++ b/Lib/tarfile.py
|
||||
@@ -516,7 +516,9 @@ def seek(self, pos=0):
|
||||
if pos - self.pos >= 0:
|
||||
blocks, remainder = divmod(pos - self.pos, self.bufsize)
|
||||
for i in range(blocks):
|
||||
- self.read(self.bufsize)
|
||||
+ data = self.read(self.bufsize)
|
||||
+ if not data:
|
||||
+ break
|
||||
self.read(remainder)
|
||||
else:
|
||||
raise StreamError("seeking backwards is not allowed")
|
||||
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
|
||||
index 29719d95b6c1..8aeb2e1b1b9a 100644
|
||||
--- a/Lib/test/test_tarfile.py
|
||||
+++ b/Lib/test/test_tarfile.py
|
||||
@@ -4480,6 +4480,22 @@ def valueerror_filter(tarinfo, path):
|
||||
with self.check_context(arc.open(errorlevel='boo!'), filtererror_filter):
|
||||
self.expect_exception(TypeError) # errorlevel is not int
|
||||
|
||||
+ @support.subTests('format', [tarfile.GNU_FORMAT, tarfile.PAX_FORMAT])
|
||||
+ def test_getmembers_big_size(self, format):
|
||||
+ # gh-151981: A loop in seek() for streaming files tried to read the
|
||||
+ # declared number of blocks even at EOF
|
||||
+ tinfo = tarfile.TarInfo("huge-file")
|
||||
+ tinfo.size = 1 << 64
|
||||
+ bio = io.BytesIO()
|
||||
+ # Write header without data
|
||||
+ bio.write(tinfo.tobuf(format))
|
||||
+
|
||||
+ # Reset & try to get contents
|
||||
+ bio.seek(0)
|
||||
+ with tarfile.open(fileobj=bio, mode="r|") as tar:
|
||||
+ with self.assertRaises(tarfile.ReadError):
|
||||
+ tar.getmembers()
|
||||
+
|
||||
|
||||
class OverwriteTests(archiver_tests.OverwriteTests, unittest.TestCase):
|
||||
testdir = os.path.join(TEMPDIR, "testoverwrite")
|
||||
--
|
||||
2.54.0
|
||||
@@ -45,6 +45,7 @@ SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.xz \
|
||||
file://CVE-2025-13462.patch \
|
||||
file://CVE-2026-4224.patch \
|
||||
file://CVE-2026-11940.patch \
|
||||
file://CVE-2026-11972.patch \
|
||||
"
|
||||
|
||||
SRC_URI:append:class-native = " \
|
||||
|
||||
Reference in New Issue
Block a user