From 362d07a50564d964fcce0b654b848906121c591a Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Sat, 19 Apr 2025 15:02:22 +0530 Subject: [PATCH 1/2] add lock held assertions --- Modules/_ctypes/_ctypes.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 5c25bff960e45f..64030685ab0695 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -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; From 79bd81dbb0995867534da3d6cc58b4696ae497e0 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Sat, 19 Apr 2025 17:48:03 +0530 Subject: [PATCH 2/2] fix arrays --- Modules/_ctypes/cfield.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 50b26f2a7e2a92..ec35686f251320 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -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 *