gh-78878: Fix crash when creating an instance of `_ctypes.CField` (#14837)

This commit is contained in:
Hai Shi 2022-12-22 01:31:17 +08:00 committed by GitHub
parent e0b4d966a8
commit d713c54ac8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 10 additions and 10 deletions

View File

@ -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):

View File

@ -0,0 +1 @@
Fix crash when creating an instance of :class:`!_ctypes.CField`.

View File

@ -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 */
};

View File

@ -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);