mirror of
https://github.com/python/cpython.git
synced 2025-09-24 17:33:29 +00:00
bpo-31095: fix potential crash during GC (GH-2974)
This commit is contained in:
parent
bf9075a0c5
commit
a6296d34a4
14 changed files with 60 additions and 13 deletions
|
@ -1717,6 +1717,8 @@ dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
|
|||
static void
|
||||
dequeiter_dealloc(dequeiterobject *dio)
|
||||
{
|
||||
/* bpo-31095: UnTrack is needed before calling any callbacks */
|
||||
PyObject_GC_UnTrack(dio);
|
||||
Py_XDECREF(dio->deque);
|
||||
PyObject_GC_Del(dio);
|
||||
}
|
||||
|
@ -2097,6 +2099,8 @@ static PyMemberDef defdict_members[] = {
|
|||
static void
|
||||
defdict_dealloc(defdictobject *dd)
|
||||
{
|
||||
/* bpo-31095: UnTrack is needed before calling any callbacks */
|
||||
PyObject_GC_UnTrack(dd);
|
||||
Py_CLEAR(dd->default_factory);
|
||||
PyDict_Type.tp_dealloc((PyObject *)dd);
|
||||
}
|
||||
|
|
|
@ -627,6 +627,7 @@ element_gc_clear(ElementObject *self)
|
|||
static void
|
||||
element_dealloc(ElementObject* self)
|
||||
{
|
||||
/* bpo-31095: UnTrack is needed before calling any callbacks */
|
||||
PyObject_GC_UnTrack(self);
|
||||
Py_TRASHCAN_SAFE_BEGIN(self)
|
||||
|
||||
|
@ -2076,6 +2077,8 @@ elementiter_dealloc(ElementIterObject *it)
|
|||
{
|
||||
Py_ssize_t i = it->parent_stack_used;
|
||||
it->parent_stack_used = 0;
|
||||
/* bpo-31095: UnTrack is needed before calling any callbacks */
|
||||
PyObject_GC_UnTrack(it);
|
||||
while (i--)
|
||||
Py_XDECREF(it->parent_stack[i].parent);
|
||||
PyMem_Free(it->parent_stack);
|
||||
|
@ -2083,7 +2086,6 @@ elementiter_dealloc(ElementIterObject *it)
|
|||
Py_XDECREF(it->sought_tag);
|
||||
Py_XDECREF(it->root_element);
|
||||
|
||||
PyObject_GC_UnTrack(it);
|
||||
PyObject_GC_Del(it);
|
||||
}
|
||||
|
||||
|
|
|
@ -113,6 +113,7 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw)
|
|||
static void
|
||||
partial_dealloc(partialobject *pto)
|
||||
{
|
||||
/* bpo-31095: UnTrack is needed before calling any callbacks */
|
||||
PyObject_GC_UnTrack(pto);
|
||||
if (pto->weakreflist != NULL)
|
||||
PyObject_ClearWeakRefs((PyObject *) pto);
|
||||
|
@ -1073,7 +1074,11 @@ lru_cache_clear_list(lru_list_elem *link)
|
|||
static void
|
||||
lru_cache_dealloc(lru_cache_object *obj)
|
||||
{
|
||||
lru_list_elem *list = lru_cache_unlink_list(obj);
|
||||
lru_list_elem *list;
|
||||
/* bpo-31095: UnTrack is needed before calling any callbacks */
|
||||
PyObject_GC_UnTrack(obj);
|
||||
|
||||
list = lru_cache_unlink_list(obj);
|
||||
Py_XDECREF(obj->maxsize_O);
|
||||
Py_XDECREF(obj->func);
|
||||
Py_XDECREF(obj->cache);
|
||||
|
|
|
@ -1084,6 +1084,8 @@ bytesiobuf_traverse(bytesiobuf *self, visitproc visit, void *arg)
|
|||
static void
|
||||
bytesiobuf_dealloc(bytesiobuf *self)
|
||||
{
|
||||
/* bpo-31095: UnTrack is needed before calling any callbacks */
|
||||
PyObject_GC_UnTrack(self);
|
||||
Py_CLEAR(self->source);
|
||||
Py_TYPE(self)->tp_free(self);
|
||||
}
|
||||
|
|
|
@ -655,7 +655,8 @@ py_encode_basestring(PyObject* self UNUSED, PyObject *pystr)
|
|||
static void
|
||||
scanner_dealloc(PyObject *self)
|
||||
{
|
||||
/* Deallocate scanner object */
|
||||
/* bpo-31095: UnTrack is needed before calling any callbacks */
|
||||
PyObject_GC_UnTrack(self);
|
||||
scanner_clear(self);
|
||||
Py_TYPE(self)->tp_free(self);
|
||||
}
|
||||
|
@ -1778,7 +1779,8 @@ bail:
|
|||
static void
|
||||
encoder_dealloc(PyObject *self)
|
||||
{
|
||||
/* Deallocate Encoder */
|
||||
/* bpo-31095: UnTrack is needed before calling any callbacks */
|
||||
PyObject_GC_UnTrack(self);
|
||||
encoder_clear(self);
|
||||
Py_TYPE(self)->tp_free(self);
|
||||
}
|
||||
|
|
|
@ -2778,6 +2778,8 @@ context_clear(PySSLContext *self)
|
|||
static void
|
||||
context_dealloc(PySSLContext *self)
|
||||
{
|
||||
/* bpo-31095: UnTrack is needed before calling any callbacks */
|
||||
PyObject_GC_UnTrack(self);
|
||||
context_clear(self);
|
||||
SSL_CTX_free(self->ctx);
|
||||
#ifdef OPENSSL_NPN_NEGOTIATED
|
||||
|
@ -4292,6 +4294,7 @@ static PyTypeObject PySSLMemoryBIO_Type = {
|
|||
static void
|
||||
PySSLSession_dealloc(PySSLSession *self)
|
||||
{
|
||||
/* bpo-31095: UnTrack is needed before calling any callbacks */
|
||||
PyObject_GC_UnTrack(self);
|
||||
Py_XDECREF(self->ctx);
|
||||
if (self->session != NULL) {
|
||||
|
|
|
@ -1589,6 +1589,8 @@ typedef struct {
|
|||
static void
|
||||
unpackiter_dealloc(unpackiterobject *self)
|
||||
{
|
||||
/* bpo-31095: UnTrack is needed before calling any callbacks */
|
||||
PyObject_GC_UnTrack(self);
|
||||
Py_XDECREF(self->so);
|
||||
PyBuffer_Release(&self->buf);
|
||||
PyObject_GC_Del(self);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue