]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-127945: add lock held assertions in ctypes arrays (#132720)
authorKumar Aditya <kumaraditya@python.org>
Sat, 19 Apr 2025 12:57:10 +0000 (18:27 +0530)
committerGitHub <noreply@github.com>
Sat, 19 Apr 2025 12:57:10 +0000 (18:27 +0530)
Modules/_ctypes/_ctypes.c
Modules/_ctypes/cfield.c

index 5c25bff960e45f7b4e49de348367cd3b05b2b36a..64030685ab0695790830f2bc7daa16f77346c64c 100644 (file)
@@ -3356,14 +3356,13 @@ _PyCData_set(ctypes_state *st,
            CDataObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value,
            Py_ssize_t size, char *ptr)
 {
+    _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(dst);
     CDataObject *src;
     int err;
 
     if (setfunc) {
         PyObject *res;
-        Py_BEGIN_CRITICAL_SECTION(dst);
         res = setfunc(ptr, value, size);
-        Py_END_CRITICAL_SECTION();
         return res;
     }
     if (!CDataObject_Check(st, value)) {
@@ -3373,9 +3372,7 @@ _PyCData_set(ctypes_state *st,
         }
         if (info && info->setfunc) {
             PyObject *res;
-            Py_BEGIN_CRITICAL_SECTION(dst);
             res = info->setfunc(ptr, value, size);
-            Py_END_CRITICAL_SECTION();
             return res;
         }
         /*
@@ -3397,9 +3394,7 @@ _PyCData_set(ctypes_state *st,
             Py_DECREF(ob);
             return result;
         } else if (value == Py_None && PyCPointerTypeObject_Check(st, type)) {
-            Py_BEGIN_CRITICAL_SECTION(dst);
             *(void **)ptr = NULL;
-            Py_END_CRITICAL_SECTION();
             Py_RETURN_NONE;
         } else {
             PyErr_Format(PyExc_TypeError,
@@ -3417,11 +3412,6 @@ _PyCData_set(ctypes_state *st,
     if (err) {
         Py_BEGIN_CRITICAL_SECTION(src);
         memcpy(ptr, src->b_ptr, size);
-
-        if (PyCPointerTypeObject_Check(st, type)) {
-            /* XXX */
-        }
-
         value = GetKeepedObjects(src);
         Py_END_CRITICAL_SECTION();
         if (value == NULL)
@@ -3485,6 +3475,8 @@ PyCData_set(ctypes_state *st,
           PyObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value,
           Py_ssize_t index, Py_ssize_t size, char *ptr)
 {
+    _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(dst);
+
     CDataObject *mem = (CDataObject *)dst;
     PyObject *result;
 
index 50b26f2a7e2a92a1b1f5036a05648b6c69cbc46b..ec35686f2513206c0dcf6bc29a37167e9732a257 100644 (file)
@@ -243,7 +243,7 @@ _pack_legacy_size(CFieldObject *field)
 }
 
 static int
-PyCField_set(PyObject *op, PyObject *inst, PyObject *value)
+PyCField_set_lock_held(PyObject *op, PyObject *inst, PyObject *value)
 {
     CDataObject *dst;
     char *ptr;
@@ -265,6 +265,16 @@ PyCField_set(PyObject *op, PyObject *inst, PyObject *value)
                        self->index, _pack_legacy_size(self), ptr);
 }
 
+static int
+PyCField_set(PyObject *op, PyObject *inst, PyObject *value)
+{
+    int res;
+    Py_BEGIN_CRITICAL_SECTION(inst);
+    res = PyCField_set_lock_held(op, inst, value);
+    Py_END_CRITICAL_SECTION();
+    return res;
+}
+
 static PyObject *
 PyCField_get(PyObject *op, PyObject *inst, PyObject *type)
 {
@@ -280,9 +290,13 @@ PyCField_get(PyObject *op, PyObject *inst, PyObject *type)
         return NULL;
     }
     src = _CDataObject_CAST(inst);
-    return PyCData_get(st, self->proto, self->getfunc, inst,
+    PyObject *res;
+    Py_BEGIN_CRITICAL_SECTION(inst);
+    res = PyCData_get(st, self->proto, self->getfunc, inst,
                        self->index, _pack_legacy_size(self),
                        src->b_ptr + self->byte_offset);
+    Py_END_CRITICAL_SECTION();
+    return res;
 }
 
 static PyObject *