]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-140306: Fix memory leaks in cross-interpreter data handling (GH-140307...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 19 Oct 2025 19:53:36 +0000 (21:53 +0200)
committerGitHub <noreply@github.com>
Sun, 19 Oct 2025 19:53:36 +0000 (19:53 +0000)
(cherry picked from commit f9323213c98c9f1f7f3bf5af883b73047432fe50)

Co-authored-by: Shamil <ashm.tech@proton.me>
Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst [new file with mode: 0644]
Modules/_interpchannelsmodule.c
Modules/_interpqueuesmodule.c
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 (file)
index 0000000..2178c49
--- /dev/null
@@ -0,0 +1,2 @@
+Fix memory leaks in cross-interpreter channel operations and shared
+namespace handling.
index 274bfacfed874b166d3fa62f0202f8a50408b7bd..ef9cf01ecbec5ee70a56a7eb91cdebf426e5a8bc 100644 (file)
@@ -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;
     }
 
index 03ed081efbae0d31f473016ea22b5561d13d8e59..872495d32fbf8ff7cee86cde1d269dcfb17612f2 100644 (file)
@@ -431,7 +431,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;
 }
 
index 16a23f0351cd263966a03c5151d77d8b43dbb0f4..542253c14de9b86c1bd46a900e6d7229897b0a40 100644 (file)
@@ -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){