From a8bc03696c7c2c03e1d580633151ec7b850366f3 Mon Sep 17 00:00:00 2001 From: Peter Bierma Date: Tue, 3 Sep 2024 16:35:57 -0400 Subject: gh-123504: Fix reference leak in finalization of `_tkinter` (#123505) --- .../2024-08-30-09-01-35.gh-issue-123504.lJ9_BB.rst | 1 + Modules/_tkinter.c | 27 +++++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2024-08-30-09-01-35.gh-issue-123504.lJ9_BB.rst diff --git a/Misc/NEWS.d/next/Library/2024-08-30-09-01-35.gh-issue-123504.lJ9_BB.rst b/Misc/NEWS.d/next/Library/2024-08-30-09-01-35.gh-issue-123504.lJ9_BB.rst new file mode 100644 index 0000000..ea504d3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-08-30-09-01-35.gh-issue-123504.lJ9_BB.rst @@ -0,0 +1 @@ +Fixed reference leak in the finalization of :mod:`tkinter`. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 1542d3a..e1e8108 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -3389,17 +3389,28 @@ DisableEventHook(void) #endif } +static int +module_clear(PyObject *mod) +{ + Py_CLEAR(Tkinter_TclError); + Py_CLEAR(Tkapp_Type); + Py_CLEAR(Tktt_Type); + Py_CLEAR(PyTclObject_Type); + return 0; +} + +static void +module_free(void *mod) +{ + module_clear((PyObject *)mod); +} static struct PyModuleDef _tkintermodule = { PyModuleDef_HEAD_INIT, - "_tkinter", - NULL, - -1, - moduleMethods, - NULL, - NULL, - NULL, - NULL + .m_name = "_tkinter", + .m_methods = moduleMethods, + .m_clear = module_clear, + .m_free = module_free }; PyMODINIT_FUNC -- cgit v0.12