mirror of
https://github.com/python/cpython.git
synced 2025-12-15 21:44:50 +00:00
bpo-35983: skip trashcan for subclasses (GH-11841)
Add new trashcan macros to deal with a double deallocation that could occur when the `tp_dealloc` of a subclass calls the `tp_dealloc` of a base class and that base class uses the trashcan mechanism. Patch by Jeroen Demeyer.
This commit is contained in:
parent
a2fedd8c91
commit
351c67416b
15 changed files with 189 additions and 121 deletions
|
|
@ -1356,28 +1356,17 @@ static PyGetSetDef odict_getset[] = {
|
|||
static void
|
||||
odict_dealloc(PyODictObject *self)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
|
||||
PyObject_GC_UnTrack(self);
|
||||
Py_TRASHCAN_SAFE_BEGIN(self)
|
||||
Py_TRASHCAN_BEGIN(self, odict_dealloc)
|
||||
|
||||
Py_XDECREF(self->od_inst_dict);
|
||||
if (self->od_weakreflist != NULL)
|
||||
PyObject_ClearWeakRefs((PyObject *)self);
|
||||
|
||||
_odict_clear_nodes(self);
|
||||
|
||||
/* Call the base tp_dealloc(). Since it too uses the trashcan mechanism,
|
||||
* temporarily decrement trash_delete_nesting to prevent triggering it
|
||||
* and putting the partially deallocated object on the trashcan's
|
||||
* to-be-deleted-later list.
|
||||
*/
|
||||
--tstate->trash_delete_nesting;
|
||||
assert(_tstate->trash_delete_nesting < PyTrash_UNWIND_LEVEL);
|
||||
PyDict_Type.tp_dealloc((PyObject *)self);
|
||||
++tstate->trash_delete_nesting;
|
||||
|
||||
Py_TRASHCAN_SAFE_END(self)
|
||||
Py_TRASHCAN_END
|
||||
}
|
||||
|
||||
/* tp_repr */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue