gh-117657: TSAN Fix races in PyMember_Get and PyMember_Set for C extensions (GH-123211)

This commit is contained in:
Daniele Parmeggiani 2024-12-03 15:41:53 +01:00 committed by GitHub
parent 84ff1313d0
commit 979bf2489d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 735 additions and 50 deletions

View file

@ -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}
};