summaryrefslogtreecommitdiffstats
path: root/Modules/_ctypes
diff options
context:
space:
mode:
authorJeffrey Kintscher <49998481+websurfer5@users.noreply.github.com>2024-01-01 16:24:24 (GMT)
committerGitHub <noreply@github.com>2024-01-01 16:24:24 (GMT)
commit5f3cc90a12d6df404fd6f48a0df1334902e271f2 (patch)
treeb0939a5ee6d6b2477179fc74f31fe854fcc57091 /Modules/_ctypes
parent4036e48d59b0f9e8057e01458ab7df3dfd323a10 (diff)
downloadcpython-5f3cc90a12d6df404fd6f48a0df1334902e271f2.zip
cpython-5f3cc90a12d6df404fd6f48a0df1334902e271f2.tar.gz
cpython-5f3cc90a12d6df404fd6f48a0df1334902e271f2.tar.bz2
gh-62260: Fix ctypes.Structure subclassing with multiple layers (GH-13374)
The length field of StgDictObject for Structure class contains now the total number of items in ffi_type_pointer.elements (excluding the trailing null). The old behavior of using the number of elements in the parent class can cause the array to be truncated when it is copied, especially when there are multiple layers of subclassing. Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Modules/_ctypes')
-rw-r--r--Modules/_ctypes/_ctypes.c10
-rw-r--r--Modules/_ctypes/stgdict.c2
2 files changed, 6 insertions, 6 deletions
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index f909a94..fc16b91 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -4354,10 +4354,10 @@ _init_pos_args(PyObject *self, PyTypeObject *type,
return index;
}
- for (i = 0;
- i < dict->length && (i+index) < PyTuple_GET_SIZE(args);
+ for (i = index;
+ i < dict->length && i < PyTuple_GET_SIZE(args);
++i) {
- PyObject *pair = PySequence_GetItem(fields, i);
+ PyObject *pair = PySequence_GetItem(fields, i - index);
PyObject *name, *val;
int res;
if (!pair)
@@ -4367,7 +4367,7 @@ _init_pos_args(PyObject *self, PyTypeObject *type,
Py_DECREF(pair);
return -1;
}
- val = PyTuple_GET_ITEM(args, i + index);
+ val = PyTuple_GET_ITEM(args, i);
if (kwds) {
res = PyDict_Contains(kwds, name);
if (res != 0) {
@@ -4388,7 +4388,7 @@ _init_pos_args(PyObject *self, PyTypeObject *type,
if (res == -1)
return -1;
}
- return index + dict->length;
+ return dict->length;
}
static int
diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c
index dfdb96b..fb3e20e 100644
--- a/Modules/_ctypes/stgdict.c
+++ b/Modules/_ctypes/stgdict.c
@@ -695,7 +695,7 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct
stgdict->size = aligned_size;
stgdict->align = total_align;
- stgdict->length = len; /* ADD ffi_ofs? */
+ stgdict->length = ffi_ofs + len;
/*
* The value of MAX_STRUCT_SIZE depends on the platform Python is running on.