summaryrefslogtreecommitdiffstats
path: root/Objects/methodobject.c
diff options
context:
space:
mode:
authorYannick Jadoul <yannick.jadoul@belgacom.net>2020-10-12 21:06:19 (GMT)
committerGitHub <noreply@github.com>2020-10-12 21:06:19 (GMT)
commit04b8631d84a870dda456ef86039c1baf34d08500 (patch)
treea452d703f712dcf9baae2c67b5439886da6adf40 /Objects/methodobject.c
parent24a54c0bd48d9f6f1a1289ca57afb381bc4b280e (diff)
downloadcpython-04b8631d84a870dda456ef86039c1baf34d08500.zip
cpython-04b8631d84a870dda456ef86039c1baf34d08500.tar.gz
cpython-04b8631d84a870dda456ef86039c1baf34d08500.tar.bz2
bpo-42015: Reorder dereferencing calls in meth_dealloc, to make sure m_self is kept alive long enough (GH-22670)
Diffstat (limited to 'Objects/methodobject.c')
-rw-r--r--Objects/methodobject.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index 5659f21..7b43041 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -164,9 +164,11 @@ meth_dealloc(PyCFunctionObject *m)
if (m->m_weakreflist != NULL) {
PyObject_ClearWeakRefs((PyObject*) m);
}
+ // Dereference class before m_self: PyCFunction_GET_CLASS accesses
+ // PyMethodDef m_ml, which could be kept alive by m_self
+ Py_XDECREF(PyCFunction_GET_CLASS(m));
Py_XDECREF(m->m_self);
Py_XDECREF(m->m_module);
- Py_XDECREF(PyCFunction_GET_CLASS(m));
PyObject_GC_Del(m);
}
@@ -243,9 +245,9 @@ meth_get__qualname__(PyCFunctionObject *m, void *closure)
static int
meth_traverse(PyCFunctionObject *m, visitproc visit, void *arg)
{
+ Py_VISIT(PyCFunction_GET_CLASS(m));
Py_VISIT(m->m_self);
Py_VISIT(m->m_module);
- Py_VISIT(PyCFunction_GET_CLASS(m));
return 0;
}