]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-127945: fix thread safety of ctypes state (#131710)
authorKumar Aditya <kumaraditya@python.org>
Tue, 25 Mar 2025 11:33:05 +0000 (17:03 +0530)
committerGitHub <noreply@github.com>
Tue, 25 Mar 2025 11:33:05 +0000 (17:03 +0530)
This fixes thread safety of `array_cache` and `swapped_suffix` by initializing them in module exec to make it thread safety.

Modules/_ctypes/_ctypes.c

index 6d817bdaecfa4ebf407393b11466b9060db0da93..d3e717757b0645ae3ff5bb30d7c00dd66833f643 100644 (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;
     }