https://github.com/python/cpython/commit/71805db4294de9495954571c82a835d94ba67594
commit: 71805db4294de9495954571c82a835d94ba67594
branch: main
author: Ivy Xu <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-06-11T22:55:11+03:00
summary:
gh-151337: Avoid possible memory leak in `_tkinter.c` on Windows. (GH-151340)
files:
A Misc/NEWS.d/next/Library/2026-06-11-21-43-24.gh-issue-151337.JSVV18.rst
M Modules/_tkinter.c
diff --git
a/Misc/NEWS.d/next/Library/2026-06-11-21-43-24.gh-issue-151337.JSVV18.rst
b/Misc/NEWS.d/next/Library/2026-06-11-21-43-24.gh-issue-151337.JSVV18.rst
new file mode 100644
index 00000000000000..0344eee9471d29
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-06-11-21-43-24.gh-issue-151337.JSVV18.rst
@@ -0,0 +1 @@
+Avoid possible memory leak in ``tkinter.c`` on Windows.
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index 58fdabecf16ada..6eca98a3c8033f 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -128,18 +128,20 @@ _get_tcl_lib_path(void)
}
/* Check expected location for an installed Python first */
- tcl_library_path = PyUnicode_FromString("\\tcl\\tcl" TCL_VERSION);
- if (tcl_library_path == NULL) {
+ PyObject* tmp_tcl_library_path = PyUnicode_FromString("\\tcl\\tcl"
TCL_VERSION);
+ if (tmp_tcl_library_path == NULL) {
Py_DECREF(prefix);
return NULL;
}
- tcl_library_path = PyUnicode_Concat(prefix, tcl_library_path);
+ tcl_library_path = PyUnicode_Concat(prefix, tmp_tcl_library_path);
+ Py_DECREF(tmp_tcl_library_path);
Py_DECREF(prefix);
if (tcl_library_path == NULL) {
return NULL;
}
stat_return_value = _Py_stat(tcl_library_path, &stat_buf);
if (stat_return_value == -2) {
+ Py_DECREF(tcl_library_path);
return NULL;
}
if (stat_return_value == -1) {
@@ -154,16 +156,17 @@ _get_tcl_lib_path(void)
}
stat_return_value = _Py_stat(tcl_library_path, &stat_buf);
if (stat_return_value == -2) {
+ Py_DECREF(tcl_library_path);
return NULL;
}
if (stat_return_value == -1) {
/* tcltkDir for a repository build doesn't exist either,
reset errno and leave Tcl to its own devices */
errno = 0;
- tcl_library_path = NULL;
+ Py_CLEAR(tcl_library_path);
}
#else
- tcl_library_path = NULL;
+ Py_CLEAR(tcl_library_path);
#endif
}
already_checked = 1;
@@ -707,11 +710,13 @@ Tkapp_New(const char *screenName, const char *className,
if (!ret && GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
str_path = _get_tcl_lib_path();
if (str_path == NULL && PyErr_Occurred()) {
+ Py_DECREF(v);
return NULL;
}
if (str_path != NULL) {
utf8_path = PyUnicode_AsUTF8String(str_path);
if (utf8_path == NULL) {
+ Py_DECREF(v);
return NULL;
}
Tcl_SetVar(v->interp,
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]