diff options
author | Yannick Jadoul <yannick.jadoul@belgacom.net> | 2020-10-12 21:06:19 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-12 21:06:19 (GMT) |
commit | 04b8631d84a870dda456ef86039c1baf34d08500 (patch) | |
tree | a452d703f712dcf9baae2c67b5439886da6adf40 /Objects/methodobject.c | |
parent | 24a54c0bd48d9f6f1a1289ca57afb381bc4b280e (diff) | |
download | cpython-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.c | 6 |
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; } |