Skip to content

Commit a495614

Browse files
[3.13] gh-149689: add missing error checks in Parser/action_helpers.c (GH-153763)
(cherry picked from commit 2dd6e59)
1 parent 0241cee commit a495614

2 files changed

Lines changed: 32 additions & 11 deletions

File tree

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix missing error propagation in parser action helpers when memory allocation
2+
fails. Patch by Thomas Kowalski.

Parser/action_helpers.c

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,11 @@ _set_seq_context(Parser *p, asdl_expr_seq *seq, expr_context_ty ctx)
253253
}
254254
for (Py_ssize_t i = 0; i < len; i++) {
255255
expr_ty e = asdl_seq_GET(seq, i);
256-
asdl_seq_SET(new_seq, i, _PyPegen_set_expr_context(p, e, ctx));
256+
expr_ty new_e = _PyPegen_set_expr_context(p, e, ctx);
257+
if (!new_e) {
258+
return NULL;
259+
}
260+
asdl_seq_SET(new_seq, i, new_e);
257261
}
258262
return new_seq;
259263
}
@@ -267,19 +271,21 @@ _set_name_context(Parser *p, expr_ty e, expr_context_ty ctx)
267271
static expr_ty
268272
_set_tuple_context(Parser *p, expr_ty e, expr_context_ty ctx)
269273
{
270-
return _PyAST_Tuple(
271-
_set_seq_context(p, e->v.Tuple.elts, ctx),
272-
ctx,
273-
EXTRA_EXPR(e, e));
274+
asdl_expr_seq *seq = _set_seq_context(p, e->v.Tuple.elts, ctx);
275+
if (!seq && PyErr_Occurred()) {
276+
return NULL;
277+
}
278+
return _PyAST_Tuple(seq, ctx, EXTRA_EXPR(e, e));
274279
}
275280

276281
static expr_ty
277282
_set_list_context(Parser *p, expr_ty e, expr_context_ty ctx)
278283
{
279-
return _PyAST_List(
280-
_set_seq_context(p, e->v.List.elts, ctx),
281-
ctx,
282-
EXTRA_EXPR(e, e));
284+
asdl_expr_seq *seq = _set_seq_context(p, e->v.List.elts, ctx);
285+
if (!seq && PyErr_Occurred()) {
286+
return NULL;
287+
}
288+
return _PyAST_List(seq, ctx, EXTRA_EXPR(e, e));
283289
}
284290

285291
static expr_ty
@@ -299,8 +305,11 @@ _set_attribute_context(Parser *p, expr_ty e, expr_context_ty ctx)
299305
static expr_ty
300306
_set_starred_context(Parser *p, expr_ty e, expr_context_ty ctx)
301307
{
302-
return _PyAST_Starred(_PyPegen_set_expr_context(p, e->v.Starred.value, ctx),
303-
ctx, EXTRA_EXPR(e, e));
308+
expr_ty inner = _PyPegen_set_expr_context(p, e->v.Starred.value, ctx);
309+
if (!inner) {
310+
return NULL;
311+
}
312+
return _PyAST_Starred(inner, ctx, EXTRA_EXPR(e, e));
304313
}
305314

306315
/* Creates an `expr_ty` equivalent to `expr` but with `ctx` as context */
@@ -1115,7 +1124,14 @@ expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_expr_seq *a, asdl_seq *b,
11151124
}
11161125

11171126
asdl_expr_seq *starreds = _PyPegen_seq_extract_starred_exprs(p, b);
1127+
if (!starreds && PyErr_Occurred()) {
1128+
return NULL;
1129+
}
1130+
11181131
asdl_keyword_seq *keywords = _PyPegen_seq_delete_starred_exprs(p, b);
1132+
if (!keywords && PyErr_Occurred()) {
1133+
return NULL;
1134+
}
11191135

11201136
if (starreds) {
11211137
total_len += asdl_seq_LEN(starreds);
@@ -1466,6 +1482,9 @@ expr_ty _PyPegen_formatted_value(Parser *p, expr_ty expression, Token *debug, Re
14661482
end_col_offset, arena
14671483
);
14681484

1485+
if (!formatted_value) {
1486+
return NULL;
1487+
}
14691488
if (debug) {
14701489
/* Find the non whitespace token after the "=" */
14711490
int debug_end_line, debug_end_offset;

0 commit comments

Comments
 (0)