From c49bea89ee8ed6ba2bf756ab8a8225fec3326f0b Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Mon, 19 Oct 2026 12:34:29 -0700 Subject: [PATCH] gh-159739: Release resources on interpreter startup error paths Release path-file read buffers on early return and the command string when an audit hook rejects execution. Backport to 3.15 and 3.14. --- .../2026-10-19-19-33-35.gh-issue-159739.c25c27.rst | 2 ++ Modules/getpath.c | 2 ++ Modules/main.c | 1 + 3 files changed, 5 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-10-19-19-33-35.gh-issue-159739.c25c27.rst 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 48047de0c12af2..10964af12819d2 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -409,9 +409,11 @@ getpath_readlines_impl(PyObject *module, PyObject *pathobj) 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 44a025d500e35e..d2587e9fffdad2 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -286,6 +286,7 @@ pymain_run_command(wchar_t *command) } if (PySys_Audit("cpython.run_command", "O", unicode) < 0) { + Py_DECREF(unicode); return pymain_exit_err_print(); }