Skip to content

Commit 74616d6

Browse files
committed
ssizet race
1 parent 2212605 commit 74616d6

File tree

2 files changed

+5
-2
lines changed

2 files changed

+5
-2
lines changed

Include/internal/pycore_pyatomic_ft_wrappers.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ extern "C" {
9191
_Py_atomic_load_long_relaxed(&value)
9292
#define FT_ATOMIC_STORE_ULONG(value, new_value) \
9393
_Py_atomic_store_ulong(&value, new_value)
94+
#define FT_ATOMIC_STORE_SSIZE_RELEASE(value, new_value) \
95+
_Py_atomic_store_ssize_release(&value, new_value)
9496

9597
#else
9698
#define FT_ATOMIC_LOAD_PTR(value) value
@@ -129,6 +131,7 @@ extern "C" {
129131
#define FT_ATOMIC_LOAD_LONG_RELAXED(value) value
130132
#define FT_ATOMIC_STORE_LONG_RELEASE(value, new_value) value = new_value
131133
#define FT_ATOMIC_STORE_ULONG(value, new_value) value = new_value
134+
#define FT_ATOMIC_STORE_SSIZE_RELEASE(value, new_value) value = new_value
132135

133136
#endif
134137

Python/structmember.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ PyMember_GetOne(const char *obj_addr, PyMemberDef *l)
6161
v = PyLong_FromUnsignedLong(FT_ATOMIC_LOAD_ULONG_RELAXED(*(unsigned long*)addr));
6262
break;
6363
case Py_T_PYSSIZET:
64-
v = PyLong_FromSsize_t(*(Py_ssize_t*)addr);
64+
v = PyLong_FromSsize_t(FT_ATOMIC_LOAD_SSIZE_RELAXED(*(Py_ssize_t*)addr));
6565
break;
6666
case Py_T_FLOAT:
6767
v = PyFloat_FromDouble((double)*(float*)addr);
@@ -283,7 +283,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)
283283
break;
284284
}
285285
case Py_T_PYSSIZET:{
286-
*(Py_ssize_t*)addr = PyLong_AsSsize_t(v);
286+
FT_ATOMIC_STORE_SSIZE_RELEASE(*(Py_ssize_t*)addr, PyLong_AsSsize_t(v));
287287
if ((*(Py_ssize_t*)addr == (Py_ssize_t)-1)
288288
&& PyErr_Occurred())
289289
return -1;

0 commit comments

Comments
 (0)