gh-127945: fix thread safety of ctypes state (#131710)

This fixes thread safety of `array_cache` and `swapped_suffix` by initializing them in module exec to make it thread safety.
This commit is contained in:
Kumar Aditya 2025-03-25 17:03:05 +05:30 committed by GitHub
parent 96ef4c511f
commit f1967e7249
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2148,18 +2148,7 @@ static PyObject *CreateSwappedType(ctypes_state *st, PyTypeObject *type,
if (!swapped_args)
return NULL;
if (st->swapped_suffix == NULL) {
#ifdef WORDS_BIGENDIAN
st->swapped_suffix = PyUnicode_InternFromString("_le");
#else
st->swapped_suffix = PyUnicode_InternFromString("_be");
#endif
}
if (st->swapped_suffix == NULL) {
Py_DECREF(swapped_args);
return NULL;
}
assert(st->swapped_suffix != NULL);
newname = PyUnicode_Concat(name, st->swapped_suffix);
if (newname == NULL) {
Py_DECREF(swapped_args);
@ -5113,12 +5102,7 @@ PyCArrayType_from_ctype(ctypes_state *st, PyObject *itemtype, Py_ssize_t length)
char name[256];
PyObject *len;
if (st->array_cache == NULL) {
st->array_cache = PyDict_New();
if (st->array_cache == NULL) {
return NULL;
}
}
assert(st->array_cache != NULL);
len = PyLong_FromSsize_t(length);
if (len == NULL)
return NULL;
@ -6099,6 +6083,20 @@ _ctypes_mod_exec(PyObject *mod)
return -1;
}
st->array_cache = PyDict_New();
if (st->array_cache == NULL) {
return -1;
}
#ifdef WORDS_BIGENDIAN
st->swapped_suffix = PyUnicode_InternFromString("_le");
#else
st->swapped_suffix = PyUnicode_InternFromString("_be");
#endif
if (st->swapped_suffix == NULL) {
return -1;
}
if (_ctypes_add_types(mod) < 0) {
return -1;
}