Skip to content

Commit 652413a

Browse files
Make a copy of data-to-be-deleted.
1 parent e99a90b commit 652413a

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

Python/pystate.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,6 +1298,7 @@ _release_xidata(void *arg)
12981298
data->free(data->data);
12991299
}
13001300
Py_XDECREF(data->obj);
1301+
PyMem_Free(data);
13011302
return 0;
13021303
}
13031304

@@ -1318,14 +1319,22 @@ _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data)
13181319
}
13191320
return;
13201321
}
1321-
// XXX There's a slight race here...
1322+
// XXX There's an ever-so-slight race here...
13221323
if (interp->finalizing) {
13231324
// XXX Someone leaked some memory...
13241325
return;
13251326
}
13261327

13271328
// "Release" the data and/or the object.
1328-
if (_Py_AddPendingCall(interp, 0, _release_xidata, data) != 0) {
1329+
_PyCrossInterpreterData *copied = PyMem_Malloc(sizeof(_PyCrossInterpreterData));
1330+
if (copied == NULL) {
1331+
PyErr_SetString(PyExc_MemoryError,
1332+
"Not enough memory to preserve cross-interpreter data");
1333+
PyErr_Print();
1334+
return;
1335+
}
1336+
memcpy(copied, data, sizeof(_PyCrossInterpreterData));
1337+
if (_Py_AddPendingCall(interp, 0, _release_xidata, copied) != 0) {
13291338
// XXX Queue full or couldn't get lock. Try again somehow?
13301339
}
13311340
}

0 commit comments

Comments
 (0)