summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2021-08-11 08:32:24 (GMT)
committerGitHub <noreply@github.com>2021-08-11 08:32:24 (GMT)
commit15f0a45b2822607f2c38685a72d06f050e24b215 (patch)
tree30bf5f725cf70a03561f286a57f65dc76274ffd9 /Objects
parentd27e2f4d118e7a9909b6a3e5da06c5ff95806a85 (diff)
downloadcpython-15f0a45b2822607f2c38685a72d06f050e24b215.zip
cpython-15f0a45b2822607f2c38685a72d06f050e24b215.tar.gz
cpython-15f0a45b2822607f2c38685a72d06f050e24b215.tar.bz2
bpo-33930: Fix segfault with deep recursion when cleaning method objects (GH-27678) (GH-27720)
(cherry picked from commit bfc2d5a5c4550ab3a2fadeb9459b4bd948ff61a2) Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
Diffstat (limited to 'Objects')
-rw-r--r--Objects/methodobject.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index 7b43041..2df63cf 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -160,7 +160,10 @@ PyCMethod_GetClass(PyObject *op)
static void
meth_dealloc(PyCFunctionObject *m)
{
- _PyObject_GC_UNTRACK(m);
+ // The Py_TRASHCAN mechanism requires that we be able to
+ // call PyObject_GC_UnTrack twice on an object.
+ PyObject_GC_UnTrack(m);
+ Py_TRASHCAN_BEGIN(m, meth_dealloc);
if (m->m_weakreflist != NULL) {
PyObject_ClearWeakRefs((PyObject*) m);
}
@@ -170,6 +173,7 @@ meth_dealloc(PyCFunctionObject *m)
Py_XDECREF(m->m_self);
Py_XDECREF(m->m_module);
PyObject_GC_Del(m);
+ Py_TRASHCAN_END;
}
static PyObject *