From 2065be9d6ebe9f2dcbf8de07028ff2c3614d2a71 Mon Sep 17 00:00:00 2001 From: Shamil Date: Thu, 19 Feb 2026 23:42:55 +0300 Subject: [PATCH] gh-144986: Fix memory leak in atexit.register() (GH-144987) (cherry picked from commit 50c14719fbd47f500dd1a468998201d22475126d) Co-authored-by: Shamil --- .../2026-02-19-00-00-00.gh-issue-144986.atexit-leak.rst | 2 ++ Modules/atexitmodule.c | 4 ++++ 2 files changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2026-02-19-00-00-00.gh-issue-144986.atexit-leak.rst diff --git a/Misc/NEWS.d/next/Library/2026-02-19-00-00-00.gh-issue-144986.atexit-leak.rst b/Misc/NEWS.d/next/Library/2026-02-19-00-00-00.gh-issue-144986.atexit-leak.rst new file mode 100644 index 00000000000000..841c3758ec4df1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-02-19-00-00-00.gh-issue-144986.atexit-leak.rst @@ -0,0 +1,2 @@ +Fix a memory leak in :func:`atexit.register`. +Patch by Shamil Abdulaev. diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index c3aad96bba6eb2..d2f739cecfbb08 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -184,6 +184,9 @@ atexit_register(PyObject *module, PyObject *args, PyObject *kwargs) return NULL; } PyObject *func_args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args)); + if (func_args == NULL) { + return NULL; + } PyObject *func_kwargs = kwargs; if (func_kwargs == NULL) @@ -191,6 +194,7 @@ atexit_register(PyObject *module, PyObject *args, PyObject *kwargs) func_kwargs = Py_None; } PyObject *callback = PyTuple_Pack(3, func, func_args, func_kwargs); + Py_DECREF(func_args); if (callback == NULL) { return NULL;