From: Mark Shannon Date: Mon, 5 May 2025 19:51:32 +0000 (+0100) Subject: GH-133261: Make sure trashcan pointers look mortal -- 32 bit (GH-133450) X-Git-Tag: v3.14.0b1~32 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d48616e08cbf069847026a2ee35017ad5cbe12a8;p=thirdparty%2FPython%2Fcpython.git GH-133261: Make sure trashcan pointers look mortal -- 32 bit (GH-133450) Make sure trashcan pointer look mortal -- 32 bit --- diff --git a/Objects/object.c b/Objects/object.c index e9a93f87be4c..723b0427e692 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -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