https://github.com/python/cpython/commit/f9323213c98c9f1f7f3bf5af883b73047432fe50
commit: f9323213c98c9f1f7f3bf5af883b73047432fe50
branch: main
author: Shamil <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2025-10-19T22:24:28+03:00
summary:
gh-140306: Fix memory leaks in cross-interpreter data handling (GH-140307)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst
M Modules/_interpchannelsmodule.c
M Modules/_interpqueuesmodule.c
M Python/crossinterp.c
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst
new file mode 100644
index 00000000000000..2178c4960636cb
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst
@@ -0,0 +1,2 @@
+Fix memory leaks in cross-interpreter channel operations and shared
+namespace handling.
diff --git a/Modules/_interpchannelsmodule.c b/Modules/_interpchannelsmodule.c
index 274bfacfed874b..ef9cf01ecbec5e 100644
--- a/Modules/_interpchannelsmodule.c
+++ b/Modules/_interpchannelsmodule.c
@@ -580,7 +580,7 @@ _channelitem_clear_data(_channelitem *item, int removed)
{
if (item->data != NULL) {
// It was allocated in channel_send().
- (void)_release_xid_data(item->data, XID_IGNORE_EXC & XID_FREE);
+ (void)_release_xid_data(item->data, XID_IGNORE_EXC | XID_FREE);
item->data = NULL;
}
diff --git a/Modules/_interpqueuesmodule.c b/Modules/_interpqueuesmodule.c
index 1db08628d29e01..417c5fbcee2645 100644
--- a/Modules/_interpqueuesmodule.c
+++ b/Modules/_interpqueuesmodule.c
@@ -436,7 +436,7 @@ _queueitem_clear_data(_queueitem *item)
return;
}
// It was allocated in queue_put().
- (void)_release_xid_data(item->data, XID_IGNORE_EXC & XID_FREE);
+ (void)_release_xid_data(item->data, XID_IGNORE_EXC | XID_FREE);
item->data = NULL;
}
diff --git a/Python/crossinterp.c b/Python/crossinterp.c
index 16a23f0351cd26..542253c14de9b8 100644
--- a/Python/crossinterp.c
+++ b/Python/crossinterp.c
@@ -1153,8 +1153,8 @@ _release_xid_data(_PyXIData_t *xidata, int rawfree)
{
PyObject *exc = PyErr_GetRaisedException();
int res = rawfree
- ? _PyXIData_Release(xidata)
- : _PyXIData_ReleaseAndRawFree(xidata);
+ ? _PyXIData_ReleaseAndRawFree(xidata)
+ : _PyXIData_Release(xidata);
if (res < 0) {
/* The owning interpreter is already destroyed. */
_PyXIData_Clear(NULL, xidata);
@@ -1805,6 +1805,15 @@ _PyXI_InitFailureUTF8(_PyXI_failure *failure,
int
_PyXI_InitFailure(_PyXI_failure *failure, _PyXI_errcode code, PyObject *obj)
{
+ *failure = (_PyXI_failure){
+ .code = code,
+ .msg = NULL,
+ .msg_owned = 0,
+ };
+ if (obj == NULL) {
+ return 0;
+ }
+
PyObject *msgobj = PyObject_Str(obj);
if (msgobj == NULL) {
return -1;
@@ -1813,7 +1822,7 @@ _PyXI_InitFailure(_PyXI_failure *failure, _PyXI_errcode
code, PyObject *obj)
// That happens automatically in _capture_current_exception().
const char *msg = _copy_string_obj_raw(msgobj, NULL);
Py_DECREF(msgobj);
- if (PyErr_Occurred()) {
+ if (msg == NULL) {
return -1;
}
*failure = (_PyXI_failure){
_______________________________________________
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]