summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHai Shi <shihai1992@gmail.com>2022-12-21 17:31:17 (GMT)
committerGitHub <noreply@github.com>2022-12-21 17:31:17 (GMT)
commitd713c54ac8a2eba0616a5a07714696d935f1062e (patch)
treeefcfc4742bccf2dec3e3ebb63d461131be995406
parente0b4d966a8d1867c4b535b043e08288ca49b3548 (diff)
downloadcpython-d713c54ac8a2eba0616a5a07714696d935f1062e.zip
cpython-d713c54ac8a2eba0616a5a07714696d935f1062e.tar.gz
cpython-d713c54ac8a2eba0616a5a07714696d935f1062e.tar.bz2
gh-78878: Fix crash when creating an instance of `_ctypes.CField` (#14837)
-rw-r--r--Lib/test/test_ctypes/test_struct_fields.py6
-rw-r--r--Misc/NEWS.d/next/Library/2022-12-19-20-54-04.gh-issue-78878.JrkYqJ.rst1
-rw-r--r--Modules/_ctypes/cfield.c11
-rw-r--r--Modules/_ctypes/stgdict.c2
4 files changed, 10 insertions, 10 deletions
diff --git a/Lib/test/test_ctypes/test_struct_fields.py b/Lib/test/test_ctypes/test_struct_fields.py
index fefeaea..e444f5e 100644
--- a/Lib/test/test_ctypes/test_struct_fields.py
+++ b/Lib/test/test_ctypes/test_struct_fields.py
@@ -54,6 +54,12 @@ class StructFieldsTestCase(unittest.TestCase):
x.char = b'a\0b\0'
self.assertEqual(bytes(x), b'a\x00###')
+ def test_6(self):
+ class X(Structure):
+ _fields_ = [("x", c_int)]
+ CField = type(X.x)
+ self.assertRaises(TypeError, CField)
+
def test_gh99275(self):
class BrokenStructure(Structure):
def __init_subclass__(cls, **kwargs):
diff --git a/Misc/NEWS.d/next/Library/2022-12-19-20-54-04.gh-issue-78878.JrkYqJ.rst b/Misc/NEWS.d/next/Library/2022-12-19-20-54-04.gh-issue-78878.JrkYqJ.rst
new file mode 100644
index 0000000..8b455fd
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-12-19-20-54-04.gh-issue-78878.JrkYqJ.rst
@@ -0,0 +1 @@
+Fix crash when creating an instance of :class:`!_ctypes.CField`.
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
index 791aeba..796a1be 100644
--- a/Modules/_ctypes/cfield.c
+++ b/Modules/_ctypes/cfield.c
@@ -30,13 +30,6 @@ static void pymem_destructor(PyObject *ptr)
/*
PyCField_Type
*/
-static PyObject *
-PyCField_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
- CFieldObject *obj;
- obj = (CFieldObject *)type->tp_alloc(type, 0);
- return (PyObject *)obj;
-}
/*
* Expects the size, index and offset for the current field in *psize and
@@ -68,7 +61,7 @@ PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
#define CONT_BITFIELD 2
#define EXPAND_BITFIELD 3
- self = (CFieldObject *)_PyObject_CallNoArgs((PyObject *)&PyCField_Type);
+ self = (CFieldObject *)PyCField_Type.tp_alloc((PyTypeObject *)&PyCField_Type, 0);
if (self == NULL)
return NULL;
dict = PyType_stgdict(desc);
@@ -341,7 +334,7 @@ PyTypeObject PyCField_Type = {
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
- PyCField_new, /* tp_new */
+ 0, /* tp_new */
0, /* tp_free */
};
diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c
index 099331c..9a4041f 100644
--- a/Modules/_ctypes/stgdict.c
+++ b/Modules/_ctypes/stgdict.c
@@ -257,7 +257,7 @@ MakeFields(PyObject *type, CFieldObject *descr,
}
continue;
}
- new_descr = (CFieldObject *)_PyObject_CallNoArgs((PyObject *)&PyCField_Type);
+ new_descr = (CFieldObject *)PyCField_Type.tp_alloc((PyTypeObject *)&PyCField_Type, 0);
if (new_descr == NULL) {
Py_DECREF(fdescr);
Py_DECREF(fieldlist);