From 725ae61f2281e995fdc2efb87a1c2a189195359e Mon Sep 17 00:00:00 2001 From: Ivy Xu Date: Tue, 16 Jun 2026 16:08:11 +0800 Subject: [PATCH 1/2] Avoid possibe memory leak in `pylifecycle.c` --- Python/pylifecycle.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 2f7f10f523c2c1d..da4204758c44a21 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -916,10 +916,12 @@ pycore_init_builtins(PyThreadState *tstate) interp->callable_cache.object__getattribute__ = object__getattribute__; if (_PyType_InitSlotDefs(interp) < 0) { + Py_XDECREF(bimod); return _PyStatus_ERR("failed to init slotdefs"); } if (_PyBuiltins_AddExceptions(bimod) < 0) { + Py_XDECREF(bimod); return _PyStatus_ERR("failed to add exceptions to builtins"); } @@ -1826,9 +1828,13 @@ finalize_clear_modules_dict(PyObject *modules) PyDict_Clear(modules); } else { - if (PyObject_CallMethodNoArgs(modules, &_Py_ID(clear)) == NULL) { + PyObject *res = PyObject_CallMethodNoArgs(modules, &_Py_ID(clear)); + if (res == NULL) { PyErr_FormatUnraisable("Exception ignored while clearing sys.modules"); } + else { + Py_DECREF(res); + } } } @@ -2932,6 +2938,7 @@ add_main_module(PyInterpreterState *interp) return _PyStatus_ERR("Failed to retrieve builtins module"); } if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) { + Py_DECREF(bimod); return _PyStatus_ERR("Failed to initialize __main__.__builtins__"); } Py_DECREF(bimod); @@ -2955,6 +2962,7 @@ add_main_module(PyInterpreterState *interp) return _PyStatus_ERR("Failed to retrieve BuiltinImporter"); } if (PyDict_SetItemString(d, "__loader__", loader) < 0) { + Py_DECREF(loader); return _PyStatus_ERR("Failed to initialize __main__.__loader__"); } Py_DECREF(loader); @@ -3189,8 +3197,14 @@ init_sys_streams(PyThreadState *tstate) config->stdio_errors); if (std == NULL) goto error; - PySys_SetObject("__stdin__", std); - _PySys_SetAttr(&_Py_ID(stdin), std); + if (PySys_SetObject("__stdin__", std) < 0) { + Py_DECREF(std); + goto error; + } + if (_PySys_SetAttr(&_Py_ID(stdin), std) < 0) { + Py_DECREF(std); + goto error; + } Py_DECREF(std); /* Set sys.stdout */ @@ -3200,8 +3214,14 @@ init_sys_streams(PyThreadState *tstate) config->stdio_errors); if (std == NULL) goto error; - PySys_SetObject("__stdout__", std); - _PySys_SetAttr(&_Py_ID(stdout), std); + if (PySys_SetObject("__stdout__", std) < 0) { + Py_DECREF(std); + goto error; + } + if (_PySys_SetAttr(&_Py_ID(stdout), std) < 0) { + Py_DECREF(std); + goto error; + } Py_DECREF(std); #if 1 /* Disable this if you have trouble debugging bootstrap stuff */ From c6037e29b83771f509d01e1f88a79ed8be6b983a Mon Sep 17 00:00:00 2001 From: Ivy Xu Date: Tue, 16 Jun 2026 16:19:51 +0800 Subject: [PATCH 2/2] Add news entry --- .../2026-06-16-16-19-42.gh-issue-146102.xtcD4F.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-06-16-16-19-42.gh-issue-146102.xtcD4F.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-06-16-16-19-42.gh-issue-146102.xtcD4F.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-06-16-16-19-42.gh-issue-146102.xtcD4F.rst new file mode 100644 index 000000000000000..a40d9e20627bf4d --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-06-16-16-19-42.gh-issue-146102.xtcD4F.rst @@ -0,0 +1 @@ +Avoid possible memory leak in ``pylifecycle.c``. Patch by Ivy Xu.