mirror of
https://github.com/python/cpython.git
synced 2025-11-03 03:22:27 +00:00
gh-109496: Detect Py_DECREF() after dealloc in debug mode (#109539)
On a Python built in debug mode, Py_DECREF() now calls _Py_NegativeRefcount() if the object is a dangling pointer to deallocated memory: memory filled with 0xDD "dead byte" by the debug hook on memory allocators. The fix is to check the reference count *before* checking for _Py_IsImmortal(). Add test_decref_freed_object() to test_capi.test_misc.
This commit is contained in:
parent
ef659b9616
commit
0bb0d88e2d
4 changed files with 56 additions and 16 deletions
|
|
@ -2034,6 +2034,26 @@ negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
|
|||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
decref_freed_object(PyObject *self, PyObject *Py_UNUSED(args))
|
||||
{
|
||||
PyObject *obj = PyUnicode_FromString("decref_freed_object");
|
||||
if (obj == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
assert(Py_REFCNT(obj) == 1);
|
||||
|
||||
// Deallocate the memory
|
||||
Py_DECREF(obj);
|
||||
// obj is a now a dangling pointer
|
||||
|
||||
// gh-109496: If Python is built in debug mode, Py_DECREF() must call
|
||||
// _Py_NegativeRefcount() and abort Python.
|
||||
Py_DECREF(obj);
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
|
@ -3299,6 +3319,7 @@ static PyMethodDef TestMethods[] = {
|
|||
{"bad_get", _PyCFunction_CAST(bad_get), METH_FASTCALL},
|
||||
#ifdef Py_REF_DEBUG
|
||||
{"negative_refcount", negative_refcount, METH_NOARGS},
|
||||
{"decref_freed_object", decref_freed_object, METH_NOARGS},
|
||||
#endif
|
||||
{"meth_varargs", meth_varargs, METH_VARARGS},
|
||||
{"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS},
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue