gh-117657: Fix data race in `_Py_IsImmortal` (#118261)

The load of `ob_ref_local races with stores. Using a relaxed load is
sufficient; stores to the field are relaxed.
This commit is contained in:
mpage 2024-04-25 08:31:57 -07:00 committed by GitHub
parent fb7f79b4da
commit f14e9f9154
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 2 additions and 2 deletions

View File

@ -349,7 +349,8 @@ static inline Py_ssize_t Py_SIZE(PyObject *ob) {
static inline Py_ALWAYS_INLINE int _Py_IsImmortal(PyObject *op)
{
#if defined(Py_GIL_DISABLED)
return (op->ob_ref_local == _Py_IMMORTAL_REFCNT_LOCAL);
return (_Py_atomic_load_uint32_relaxed(&op->ob_ref_local) ==
_Py_IMMORTAL_REFCNT_LOCAL);
#elif SIZEOF_VOID_P > 4
return (_Py_CAST(PY_INT32_T, op->ob_refcnt) < 0);
#else

View File

@ -14,7 +14,6 @@ race:set_allocator_unlocked
race:_add_to_weak_set
race:_in_weak_set
race:_mi_heap_delayed_free_partial
race:_Py_IsImmortal
race:_Py_IsOwnedByCurrentThread
race:_PyEval_EvalFrameDefault
race:_PyFunction_SetVersion