summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPablo Galindo <Pablogsal@gmail.com>2019-10-08 00:43:14 +0100
committerGitHub <noreply@github.com>2019-10-08 00:43:14 +0100
commit36e33c360ed7716a2b5ab2b53210da81f8ce1295 (patch)
tree69b16a8a625c5915dd0c730b14b99d1455046de0
parent1b1845569539db5c1a6948a5d32daea381f1e35f (diff)
downloadcpython-git-36e33c360ed7716a2b5ab2b53210da81f8ce1295.tar.gz
bpo-38400 Don't check for NULL linked list pointers in _PyObject_IsFreed (GH-16630)
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.
-rw-r--r--Objects/object.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/Objects/object.c b/Objects/object.c
index ae76e33e1f..2c8e823f05 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;
}