From 18d8821b2b9e2885febc4b261dab8ba2dccaf331 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 8 Oct 2019 00:20:51 +0100 Subject: [PATCH] bpo-38400 Don't check NULL linked list pointers in _PyObject_IsFreed Some objects like Py_None are not initialized with conventional means that prepare the circular linked list pointers, leaving them unlinked from the rest of the objects. For those objects, NULL pointers does not mean that they are freed, so we need to skip the check in those cases. --- Objects/object.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Objects/object.c b/Objects/object.c index ae76e33e1f4f1f..2c8e823f05ee94 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -454,9 +454,12 @@ _PyObject_IsFreed(PyObject *op) /* ignore op->ob_ref: its value can have be modified by Py_INCREF() and Py_DECREF(). */ #ifdef Py_TRACE_REFS - if (_PyMem_IsPtrFreed(op->_ob_next) || _PyMem_IsPtrFreed(op->_ob_prev)) { + if (op->_ob_next != NULL && _PyMem_IsPtrFreed(op->_ob_next)) { return 1; } + if (op->_ob_prev != NULL && _PyMem_IsPtrFreed(op->_ob_prev)) { + return 1; + } #endif return 0; }