Skip to content

Commit

Permalink
bpo-42015: Reorder dereferencing calls in meth_dealloc, to make sure …
Browse files Browse the repository at this point in the history
…m_self is kept alive long enough (GH-22670)

(cherry picked from commit 04b8631)

Co-authored-by: Yannick Jadoul <[email protected]>
  • Loading branch information
miss-islington and YannickJadoul authored Oct 12, 2020
1 parent 85d5964 commit 8a12503
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix potential crash in deallocating method objects when dynamically
allocated `PyMethodDef`'s lifetime is managed through the ``self``
argument of a `PyCFunction`.
6 changes: 4 additions & 2 deletions Objects/methodobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 8a12503

Please sign in to comment.