From 7fd708b727fe19403726da6cb912b81768a96946 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Fri, 18 Apr 2025 21:03:42 +0530 Subject: [PATCH] gh-132685: fix thread safety of `PyMember_GetOne` with `_Py_T_OBJECT` (#132690) --- Python/structmember.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Python/structmember.c b/Python/structmember.c index d36e049d6b5..574acf29615 100644 --- a/Python/structmember.c +++ b/Python/structmember.c @@ -85,10 +85,22 @@ PyMember_GetOne(const char *obj_addr, PyMemberDef *l) break; } case _Py_T_OBJECT: - v = *(PyObject **)addr; - if (v == NULL) + v = FT_ATOMIC_LOAD_PTR(*(PyObject **) addr); + if (v != NULL) { +#ifdef Py_GIL_DISABLED + if (!_Py_TryIncrefCompare((PyObject **) addr, v)) { + Py_BEGIN_CRITICAL_SECTION((PyObject *) obj_addr); + v = FT_ATOMIC_LOAD_PTR(*(PyObject **) addr); + Py_XINCREF(v); + Py_END_CRITICAL_SECTION(); + } +#else + Py_INCREF(v); +#endif + } + if (v == NULL) { v = Py_None; - Py_INCREF(v); + } break; case Py_T_OBJECT_EX: v = member_get_object(addr, obj_addr, l);