]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-151238: Check for `_get_resized_exprs` failure in `_PyPegen_{joined,template}_str...
authorStan Ulbrych <stan@python.org>
Thu, 11 Jun 2026 14:26:46 +0000 (15:26 +0100)
committerGitHub <noreply@github.com>
Thu, 11 Jun 2026 14:26:46 +0000 (15:26 +0100)
Lib/test/test_fstring.py
Misc/NEWS.d/next/Core_and_Builtins/2026-06-10-15-19-58.gh-issue-151238.C9Wu4x.rst [new file with mode: 0644]
Parser/action_helpers.c

index 05d0cbd2445c4cbf8bbcad527cbb7fb808863b86..5cc02c30ec2ba3391e313087e29859dec7936929 100644 (file)
@@ -593,6 +593,17 @@ x = (
                              r"""b'' f''""",
                              ])
 
+    def test_concat_decode_failure_does_not_crash(self):
+        script = r'''
+import builtins
+builtins.__import__ = builtins  # Breaks warning machinery so _get_resized_exprs returns NULL
+try:
+    compile('"x"f"\]"b""', '<test>', 'exec')
+except Exception:
+    pass
+'''
+        assert_python_ok('-c', script)
+
     def test_literal(self):
         self.assertEqual(f'', '')
         self.assertEqual(f'a', 'a')
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-06-10-15-19-58.gh-issue-151238.C9Wu4x.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-06-10-15-19-58.gh-issue-151238.C9Wu4x.rst
new file mode 100644 (file)
index 0000000..fe7519f
--- /dev/null
@@ -0,0 +1,2 @@
+Fix a crash when compiling a concatenated f-string or t-string if an error
+occurs when processing one of it's parts.
index 5e52bb838719046485bde7d88f37d9a83e6a6d7d..c74eb34deb7c35cb97d6e9ec92d387f0f0dae8a3 100644 (file)
@@ -1416,6 +1416,9 @@ expr_ty
 _PyPegen_template_str(Parser *p, Token *a, asdl_expr_seq *raw_expressions, Token *b) {
 
     asdl_expr_seq *resized_exprs = _get_resized_exprs(p, a, raw_expressions, b, TSTRING);
+    if (resized_exprs == NULL) {
+        return NULL;
+    }
     return _PyAST_TemplateStr(resized_exprs, a->lineno, a->col_offset,
                               b->end_lineno, b->end_col_offset,
                               p->arena);
@@ -1425,6 +1428,9 @@ expr_ty
 _PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* raw_expressions, Token*b) {
 
     asdl_expr_seq *resized_exprs = _get_resized_exprs(p, a, raw_expressions, b, FSTRING);
+    if (resized_exprs == NULL) {
+        return NULL;
+    }
     return _PyAST_JoinedStr(resized_exprs, a->lineno, a->col_offset,
                             b->end_lineno, b->end_col_offset,
                             p->arena);