Skip to content

Commit 7fd708b

Browse files
pythongh-132685: fix thread safety of PyMember_GetOne with _Py_T_OBJECT (python#132690)
1 parent e77d678 commit 7fd708b

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

Python/structmember.c

+15-3
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,22 @@ PyMember_GetOne(const char *obj_addr, PyMemberDef *l)
8585
break;
8686
}
8787
case _Py_T_OBJECT:
88-
v = *(PyObject **)addr;
89-
if (v == NULL)
88+
v = FT_ATOMIC_LOAD_PTR(*(PyObject **) addr);
89+
if (v != NULL) {
90+
#ifdef Py_GIL_DISABLED
91+
if (!_Py_TryIncrefCompare((PyObject **) addr, v)) {
92+
Py_BEGIN_CRITICAL_SECTION((PyObject *) obj_addr);
93+
v = FT_ATOMIC_LOAD_PTR(*(PyObject **) addr);
94+
Py_XINCREF(v);
95+
Py_END_CRITICAL_SECTION();
96+
}
97+
#else
98+
Py_INCREF(v);
99+
#endif
100+
}
101+
if (v == NULL) {
90102
v = Py_None;
91-
Py_INCREF(v);
103+
}
92104
break;
93105
case Py_T_OBJECT_EX:
94106
v = member_get_object(addr, obj_addr, l);

0 commit comments

Comments
 (0)