Skip to content

Commit f3532d6

Browse files
[3.15] gh-151238: Check for _get_resized_exprs failure in _PyPegen_{joined,template}_str (GH-151259) (#151344)
(cherry picked from commit 4b44b1e) Co-authored-by: Stan Ulbrych <stan@python.org>
1 parent dc5ebe3 commit f3532d6

3 files changed

Lines changed: 19 additions & 0 deletions

File tree

Lib/test/test_fstring.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,17 @@ def test_compile_time_concat_errors(self):
593593
r"""b'' f''""",
594594
])
595595

596+
def test_concat_decode_failure_does_not_crash(self):
597+
script = r'''
598+
import builtins
599+
builtins.__import__ = builtins # Breaks warning machinery so _get_resized_exprs returns NULL
600+
try:
601+
compile('"x"f"\]"b""', '<test>', 'exec')
602+
except Exception:
603+
pass
604+
'''
605+
assert_python_ok('-c', script)
606+
596607
def test_literal(self):
597608
self.assertEqual(f'', '')
598609
self.assertEqual(f'a', 'a')
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix a crash when compiling a concatenated f-string or t-string if an error
2+
occurs when processing one of it's parts.

Parser/action_helpers.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1416,6 +1416,9 @@ expr_ty
14161416
_PyPegen_template_str(Parser *p, Token *a, asdl_expr_seq *raw_expressions, Token *b) {
14171417

14181418
asdl_expr_seq *resized_exprs = _get_resized_exprs(p, a, raw_expressions, b, TSTRING);
1419+
if (resized_exprs == NULL) {
1420+
return NULL;
1421+
}
14191422
return _PyAST_TemplateStr(resized_exprs, a->lineno, a->col_offset,
14201423
b->end_lineno, b->end_col_offset,
14211424
p->arena);
@@ -1425,6 +1428,9 @@ expr_ty
14251428
_PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* raw_expressions, Token*b) {
14261429

14271430
asdl_expr_seq *resized_exprs = _get_resized_exprs(p, a, raw_expressions, b, FSTRING);
1431+
if (resized_exprs == NULL) {
1432+
return NULL;
1433+
}
14281434
return _PyAST_JoinedStr(resized_exprs, a->lineno, a->col_offset,
14291435
b->end_lineno, b->end_col_offset,
14301436
p->arena);

0 commit comments

Comments
 (0)