]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-144872: fix heap buffer overflow `_PyTokenizer_ensure_utf8` (GH-144807...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 26 Feb 2026 23:01:12 +0000 (00:01 +0100)
committerGitHub <noreply@github.com>
Thu, 26 Feb 2026 23:01:12 +0000 (23:01 +0000)
Co-authored-by: AdamKorcz <44787359+AdamKorcz@users.noreply.github.com>
Lib/test/test_source_encoding.py
Misc/NEWS.d/next/Core_and_Builtins/2026-02-16-12-28-43.gh-issue-144872.k9_Q30.rst [new file with mode: 0644]
Parser/tokenizer/helpers.c

index 36c8d87182dcf9dc62cd4691366551afbbd0e3b0..5fae8a7c5bf05131b7675248dcf0ad8387a9a6f9 100644 (file)
@@ -65,6 +65,23 @@ class MiscSourceEncodingTest(unittest.TestCase):
         # two bytes in common with the UTF-8 BOM
         self.assertRaises(SyntaxError, eval, b'\xef\xbb\x20')
 
+    def test_truncated_utf8_at_eof(self):
+        # Regression test for https://issues.oss-fuzz.com/issues/451112368
+        # Truncated multi-byte UTF-8 sequences at end of input caused an
+        # out-of-bounds read in Parser/tokenizer/helpers.c:valid_utf8().
+        truncated = [
+            b'\xc2',              # 2-byte lead, missing 1 continuation
+            b'\xdf',              # 2-byte lead, missing 1 continuation
+            b'\xe0',              # 3-byte lead, missing 2 continuations
+            b'\xe0\xa0',          # 3-byte lead, missing 1 continuation
+            b'\xf0\x90',          # 4-byte lead, missing 2 continuations
+            b'\xf0\x90\x80',      # 4-byte lead, missing 1 continuation
+            b'\xf3',              # 4-byte lead, missing 3 (the oss-fuzz reproducer)
+        ]
+        for seq in truncated:
+            with self.subTest(seq=seq):
+                self.assertRaises(SyntaxError, compile, seq, '<test>', 'exec')
+
     @support.requires_subprocess()
     def test_20731(self):
         sub = subprocess.Popen([sys.executable,
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-16-12-28-43.gh-issue-144872.k9_Q30.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-16-12-28-43.gh-issue-144872.k9_Q30.rst
new file mode 100644 (file)
index 0000000..c06bf01
--- /dev/null
@@ -0,0 +1 @@
+Fix heap buffer overflow in the parser found by OSS-Fuzz.
index e5e2eed2d34aee0b7cc42355cc2bb168e0df5c04..7bdf6367671f4feb60680aba147b164c3bac89de 100644 (file)
@@ -494,9 +494,11 @@ valid_utf8(const unsigned char* s)
         return 0;
     }
     length = expected + 1;
-    for (; expected; expected--)
-        if (s[expected] < 0x80 || s[expected] >= 0xC0)
+    for (int i = 1; i <= expected; i++) {
+        if (s[i] < 0x80 || s[i] >= 0xC0) {
             return 0;
+        }
+    }
     return length;
 }