https://github.com/python/cpython/commit/4c949e39460a82f1f00659202dcc7866fd05c644 commit: 4c949e39460a82f1f00659202dcc7866fd05c644 branch: 3.14 author: Miss Islington (bot) <[email protected]> committer: JelleZijlstra <[email protected]> date: 2026-08-28T19:56:34-07:00 summary:
[3.14] gh-156525: fix a few error path scope management bugs in symtable (GH-156526) (#156533) gh-156525: fix a few error path scope management bugs in symtable (GH-156526) (cherry picked from commit 932822cbc998c16616f33078b421373a53ced4d0) Co-authored-by: Irit Katriel <[email protected]> files: M Python/symtable.c diff --git a/Python/symtable.c b/Python/symtable.c index 6847f97cf476e9..442214d1e34d6c 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -1452,6 +1452,7 @@ symtable_enter_existing_block(struct symtable *st, PySTEntryObject* ste, bool ad if (add_to_children && prev) { if (PyList_Append(prev->ste_children, (PyObject *)ste) < 0) { + symtable_exit_block(st); return 0; } } @@ -1463,21 +1464,27 @@ symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block, void *ast, _Py_SourceLocation loc) { PySTEntryObject *ste = ste_new(st, name, block, ast, loc); - if (ste == NULL) + if (ste == NULL) { return 0; + } int result = symtable_enter_existing_block(st, ste, /* add_to_children */true); Py_DECREF(ste); + if (result == 0) { + return 0; + } if (block == AnnotationBlock || block == TypeVariableBlock || block == TypeAliasBlock) { _Py_DECLARE_STR(format, ".format"); // We need to insert code that reads this "parameter" to the function. if (!symtable_add_def(st, &_Py_STR(format), DEF_PARAM, loc)) { + symtable_exit_block(st); return 0; } if (!symtable_add_def(st, &_Py_STR(format), USE, loc)) { + symtable_exit_block(st); return 0; } } - return result; + return 1; } static long @@ -1673,7 +1680,7 @@ symtable_enter_type_param_block(struct symtable *st, identifier name, if (current_type == ClassBlock) { st->st_cur->ste_can_see_class_scope = 1; if (!symtable_add_def(st, &_Py_ID(__classdict__), USE, loc)) { - return 0; + goto error; } } if (kind == ClassDef_kind) { @@ -1681,33 +1688,36 @@ symtable_enter_type_param_block(struct symtable *st, identifier name, // It gets "set" when we create the type params tuple and // "used" when we build up the bases. if (!symtable_add_def(st, &_Py_STR(type_params), DEF_LOCAL, loc)) { - return 0; + goto error; } if (!symtable_add_def(st, &_Py_STR(type_params), USE, loc)) { - return 0; + goto error; } // This is used for setting the generic base _Py_DECLARE_STR(generic_base, ".generic_base"); if (!symtable_add_def(st, &_Py_STR(generic_base), DEF_LOCAL, loc)) { - return 0; + goto error; } if (!symtable_add_def(st, &_Py_STR(generic_base), USE, loc)) { - return 0; + goto error; } } if (has_defaults) { _Py_DECLARE_STR(defaults, ".defaults"); if (!symtable_add_def(st, &_Py_STR(defaults), DEF_PARAM, loc)) { - return 0; + goto error; } } if (has_kwdefaults) { _Py_DECLARE_STR(kwdefaults, ".kwdefaults"); if (!symtable_add_def(st, &_Py_STR(kwdefaults), DEF_PARAM, loc)) { - return 0; + goto error; } } return 1; +error: + symtable_exit_block(st); + return 0; } /* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument. _______________________________________________ Python-checkins mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3//lists/python-checkins.python.org Member address: [email protected]
