https://github.com/python/cpython/commit/ca95e979d6c9c62696bf3c162ddc21eae841c804
commit: ca95e979d6c9c62696bf3c162ddc21eae841c804
branch: main
author: Brandon <[email protected]>
committer: vstinner <[email protected]>
date: 2026-03-30T22:04:04+02:00
summary:
gh-146442: Fix various bugs in compiler pipeline (#146443)
Fix null derefs, missing decrefs, and unchecked returns from bug report.
files:
M Python/assemble.c
M Python/codegen.c
M Python/compile.c
diff --git a/Python/assemble.c b/Python/assemble.c
index 7c08488092de63..3df959c3634195 100644
--- a/Python/assemble.c
+++ b/Python/assemble.c
@@ -418,6 +418,7 @@ assemble_emit_instr(struct assembler *a, instruction *instr)
int size = instr_size(instr);
if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
if (len > PY_SSIZE_T_MAX / 2) {
+ PyErr_NoMemory();
return ERROR;
}
RETURN_IF_ERROR(_PyBytes_Resize(&a->a_bytecode, len * 2));
diff --git a/Python/codegen.c b/Python/codegen.c
index d300d77e0f73b0..aca590d055f466 100644
--- a/Python/codegen.c
+++ b/Python/codegen.c
@@ -667,8 +667,8 @@ codegen_unwind_fblock_stack(compiler *c, location *ploc,
_PyCompile_PopFBlock(c, top->fb_type, top->fb_block);
RETURN_IF_ERROR(codegen_unwind_fblock(c, ploc, ©, preserve_tos));
RETURN_IF_ERROR(codegen_unwind_fblock_stack(c, ploc, preserve_tos, loop));
- _PyCompile_PushFBlock(c, copy.fb_loc, copy.fb_type, copy.fb_block,
- copy.fb_exit, copy.fb_datum);
+ RETURN_IF_ERROR(_PyCompile_PushFBlock(c, copy.fb_loc, copy.fb_type,
copy.fb_block,
+ copy.fb_exit, copy.fb_datum));
return SUCCESS;
}
@@ -715,10 +715,14 @@ codegen_setup_annotations_scope(compiler *c, location loc,
// if .format > VALUE_WITH_FAKE_GLOBALS: raise NotImplementedError
PyObject *value_with_fake_globals =
PyLong_FromLong(_Py_ANNOTATE_FORMAT_VALUE_WITH_FAKE_GLOBALS);
+ if (value_with_fake_globals == NULL) {
+ return ERROR;
+ }
+
assert(!SYMTABLE_ENTRY(c)->ste_has_docstring);
_Py_DECLARE_STR(format, ".format");
ADDOP_I(c, loc, LOAD_FAST, 0);
- ADDOP_LOAD_CONST(c, loc, value_with_fake_globals);
+ ADDOP_LOAD_CONST_NEW(c, loc, value_with_fake_globals);
ADDOP_I(c, loc, COMPARE_OP, (Py_GT << 5) | compare_masks[Py_GT]);
NEW_JUMP_TARGET_LABEL(c, body);
ADDOP_JUMP(c, loc, POP_JUMP_IF_FALSE, body);
@@ -794,6 +798,9 @@ codegen_deferred_annotations_body(compiler *c, location loc,
if (!mangled) {
return ERROR;
}
+ // NOTE: ref of mangled can be leaked on ADDOP* and VISIT macros due
to early returns
+ // fixing would require an overhaul of these macros
+
PyObject *cond_index = PyList_GET_ITEM(conditional_annotation_indices,
i);
assert(PyLong_CheckExact(cond_index));
long idx = PyLong_AS_LONG(cond_index);
@@ -3279,7 +3286,10 @@ codegen_nameop(compiler *c, location loc,
}
int scope = _PyST_GetScope(SYMTABLE_ENTRY(c), mangled);
- RETURN_IF_ERROR(scope);
+ if (scope == -1) {
+ goto error;
+ }
+
_PyCompile_optype optype;
Py_ssize_t arg = 0;
if (_PyCompile_ResolveNameop(c, mangled, scope, &optype, &arg) < 0) {
diff --git a/Python/compile.c b/Python/compile.c
index 4cf178b06ae11d..365b118cc71b44 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -1100,18 +1100,22 @@ _PyCompile_TweakInlinedComprehensionScopes(compiler *c,
location loc,
assert(orig == NULL || orig == Py_True || orig == Py_False);
if (orig != Py_True) {
if (PyDict_SetItem(c->u->u_metadata.u_fasthidden, k,
Py_True) < 0) {
+ Py_XDECREF(orig);
return ERROR;
}
if (state->fast_hidden == NULL) {
state->fast_hidden = PySet_New(NULL);
if (state->fast_hidden == NULL) {
+ Py_XDECREF(orig);
return ERROR;
}
}
if (PySet_Add(state->fast_hidden, k) < 0) {
+ Py_XDECREF(orig);
return ERROR;
}
}
+ Py_XDECREF(orig);
}
}
}
_______________________________________________
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]