diff options
author | Hai Shi <shihai1992@gmail.com> | 2022-12-21 17:31:17 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-21 17:31:17 (GMT) |
commit | d713c54ac8a2eba0616a5a07714696d935f1062e (patch) | |
tree | efcfc4742bccf2dec3e3ebb63d461131be995406 | |
parent | e0b4d966a8d1867c4b535b043e08288ca49b3548 (diff) | |
download | cpython-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.py | 6 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2022-12-19-20-54-04.gh-issue-78878.JrkYqJ.rst | 1 | ||||
-rw-r--r-- | Modules/_ctypes/cfield.c | 11 | ||||
-rw-r--r-- | Modules/_ctypes/stgdict.c | 2 |
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); |