mirror of
https://github.com/python/cpython.git
synced 2025-11-02 03:01:58 +00:00
gh-117657: TSAN Fix races in PyMember_Get and PyMember_Set for C extensions (GH-123211)
This commit is contained in:
parent
84ff1313d0
commit
979bf2489d
10 changed files with 735 additions and 50 deletions
|
|
@ -22,6 +22,7 @@ typedef struct {
|
|||
char inplace_member[6];
|
||||
long long longlong_member;
|
||||
unsigned long long ulonglong_member;
|
||||
char char_member;
|
||||
} all_structmembers;
|
||||
|
||||
typedef struct {
|
||||
|
|
@ -46,6 +47,7 @@ static struct PyMemberDef test_members_newapi[] = {
|
|||
{"T_STRING_INPLACE", Py_T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
|
||||
{"T_LONGLONG", Py_T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
|
||||
{"T_ULONGLONG", Py_T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
|
||||
{"T_CHAR", Py_T_CHAR, offsetof(test_structmembers, structmembers.char_member), 0, NULL},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
|
|
@ -56,9 +58,9 @@ test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
|
|||
"T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
|
||||
"T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
|
||||
"T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
|
||||
"T_LONGLONG", "T_ULONGLONG",
|
||||
"T_LONGLONG", "T_ULONGLONG", "T_CHAR",
|
||||
NULL};
|
||||
static const char fmt[] = "|bbBhHiIlknfds#LK";
|
||||
static const char fmt[] = "|bbBhHiIlknfds#LKC";
|
||||
test_structmembers *ob;
|
||||
const char *s = NULL;
|
||||
Py_ssize_t string_len = 0;
|
||||
|
|
@ -82,7 +84,8 @@ test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
|
|||
&ob->structmembers.double_member,
|
||||
&s, &string_len,
|
||||
&ob->structmembers.longlong_member,
|
||||
&ob->structmembers.ulonglong_member))
|
||||
&ob->structmembers.ulonglong_member,
|
||||
&ob->structmembers.char_member))
|
||||
{
|
||||
Py_DECREF(ob);
|
||||
return NULL;
|
||||
|
|
@ -132,6 +135,7 @@ static struct PyMemberDef test_members[] = {
|
|||
{"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
|
||||
{"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
|
||||
{"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
|
||||
{"T_CHAR", T_CHAR, offsetof(test_structmembers, structmembers.char_member), 0, NULL},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue