gh-140306: Fix memory leaks in cross-interpreter data handling (GH-140307)

This commit is contained in:
Shamil 2025-10-19 22:24:28 +03:00 committed by GitHub
parent bad8d6de37
commit f9323213c9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 16 additions and 5 deletions

View file

@ -0,0 +1,2 @@
Fix memory leaks in cross-interpreter channel operations and shared
namespace handling.

View file

@ -580,7 +580,7 @@ _channelitem_clear_data(_channelitem *item, int removed)
{ {
if (item->data != NULL) { if (item->data != NULL) {
// It was allocated in channel_send(). // 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; item->data = NULL;
} }

View file

@ -436,7 +436,7 @@ _queueitem_clear_data(_queueitem *item)
return; return;
} }
// It was allocated in queue_put(). // 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; item->data = NULL;
} }

View file

@ -1153,8 +1153,8 @@ _release_xid_data(_PyXIData_t *xidata, int rawfree)
{ {
PyObject *exc = PyErr_GetRaisedException(); PyObject *exc = PyErr_GetRaisedException();
int res = rawfree int res = rawfree
? _PyXIData_Release(xidata) ? _PyXIData_ReleaseAndRawFree(xidata)
: _PyXIData_ReleaseAndRawFree(xidata); : _PyXIData_Release(xidata);
if (res < 0) { if (res < 0) {
/* The owning interpreter is already destroyed. */ /* The owning interpreter is already destroyed. */
_PyXIData_Clear(NULL, xidata); _PyXIData_Clear(NULL, xidata);
@ -1805,6 +1805,15 @@ _PyXI_InitFailureUTF8(_PyXI_failure *failure,
int int
_PyXI_InitFailure(_PyXI_failure *failure, _PyXI_errcode code, PyObject *obj) _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); PyObject *msgobj = PyObject_Str(obj);
if (msgobj == NULL) { if (msgobj == NULL) {
return -1; return -1;
@ -1813,7 +1822,7 @@ _PyXI_InitFailure(_PyXI_failure *failure, _PyXI_errcode code, PyObject *obj)
// That happens automatically in _capture_current_exception(). // That happens automatically in _capture_current_exception().
const char *msg = _copy_string_obj_raw(msgobj, NULL); const char *msg = _copy_string_obj_raw(msgobj, NULL);
Py_DECREF(msgobj); Py_DECREF(msgobj);
if (PyErr_Occurred()) { if (msg == NULL) {
return -1; return -1;
} }
*failure = (_PyXI_failure){ *failure = (_PyXI_failure){