]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-133261: Make sure trashcan pointers look mortal -- 32 bit (GH-133450)
authorMark Shannon <mark@hotpy.org>
Mon, 5 May 2025 19:51:32 +0000 (20:51 +0100)
committerGitHub <noreply@github.com>
Mon, 5 May 2025 19:51:32 +0000 (21:51 +0200)
Make sure trashcan pointer look mortal -- 32 bit

Objects/object.c

index e9a93f87be4cf7586ec61462f3e9734429b7a749..723b0427e69251520db590c67b44e98113d0b476 100644 (file)
@@ -2940,20 +2940,29 @@ pointer_to_safe_refcount(void *ptr)
 {
     uintptr_t full = (uintptr_t)ptr;
     assert((full & 3) == 0);
+#if SIZEOF_VOID_P > 4
     uint32_t refcnt = (uint32_t)full;
     if (refcnt >= (uint32_t)_Py_IMMORTAL_MINIMUM_REFCNT) {
         full = full - ((uintptr_t)_Py_IMMORTAL_MINIMUM_REFCNT) + 1;
     }
     return full + 2;
+#else
+    // Make the top two bits 0, so it appears mortal.
+    return (full >> 2) + 1;
+#endif
 }
 
 static void *
 safe_refcount_to_pointer(uintptr_t refcnt)
 {
+#if SIZEOF_VOID_P > 4
     if (refcnt & 1) {
         refcnt += _Py_IMMORTAL_MINIMUM_REFCNT - 1;
     }
     return (void *)(refcnt - 2);
+#else
+    return (void *)((refcnt -1) << 2);
+#endif
 }
 #endif