]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38400 Don't check for NULL linked list pointers in _PyObject_IsFreed (GH-16630)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 19 Jan 2020 23:43:12 +0000 (15:43 -0800)
committerGitHub <noreply@github.com>
Sun, 19 Jan 2020 23:43:12 +0000 (15:43 -0800)
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.
(cherry picked from commit 36e33c360ed7716a2b5ab2b53210da81f8ce1295)

Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
Objects/object.c

index 8a3f8831d6e92a5b8db06efe6733a8df4b02a428..21fa7b56607dfa638a5a8dced8a752b4b59db21d 100644 (file)
@@ -426,9 +426,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;
 }