From 01cea0a93c029e34b8dc419d27a4e16f078b2c43 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Tue, 25 Mar 2025 11:02:49 +0000 Subject: [PATCH] fix thread safety of ctypes state --- Modules/_ctypes/_ctypes.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 6d817bdaecfa4e..d3e717757b0645 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -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; }