diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-10-19-19-33-35.gh-issue-159739.c25c27.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-10-19-19-33-35.gh-issue-159739.c25c27.rst new file mode 100644 index 00000000000000..b48d1e76954193 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-10-19-19-33-35.gh-issue-159739.c25c27.rst @@ -0,0 +1,2 @@ +Fix memory leaks during interpreter startup when a path configuration file is +empty or too large, or when an audit hook rejects a command. diff --git a/Modules/getpath.c b/Modules/getpath.c index 1e75993480ae36..ada8a27be4c70f 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -374,9 +374,11 @@ getpath_readlines(PyObject *Py_UNUSED(self), PyObject *args) size_t cb = fread(buffer, 1, MAX_FILE, fp); fclose(fp); if (!cb) { + PyMem_Free(buffer); return r; } if (cb >= MAX_FILE) { + PyMem_Free(buffer); Py_DECREF(r); PyErr_SetString(PyExc_MemoryError, "cannot read file larger than 32KB during initialization"); diff --git a/Modules/main.c b/Modules/main.c index 7d30935cd9e356..9977ad5f2d22ec 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -253,6 +253,7 @@ pymain_run_command(wchar_t *command) } if (PySys_Audit("cpython.run_command", "O", unicode) < 0) { + Py_DECREF(unicode); return pymain_exit_err_print(); }