Skip to content

Commit

Permalink
pythongh-78878: Fix crash when creating an instance of `_ctypes.CFiel…
Browse files Browse the repository at this point in the history
…d` (pythonGH-14837)

(cherry picked from commit d713c54)

Co-authored-by: Hai Shi <shihai1992@gmail.com>
  • Loading branch information
shihai1991 authored and miss-islington committed Dec 21, 2022
1 parent 0397f04 commit 8b8519a
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 10 deletions.
6 changes: 6 additions & 0 deletions Lib/ctypes/test/test_struct_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ class X(Structure):
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):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix crash when creating an instance of :class:`!_ctypes.CField`.
11 changes: 2 additions & 9 deletions Modules/_ctypes/cfield.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -343,7 +336,7 @@ PyTypeObject PyCField_Type = {
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
PyCField_new, /* tp_new */
0, /* tp_new */
0, /* tp_free */
};

Expand Down
2 changes: 1 addition & 1 deletion Modules/_ctypes/stgdict.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,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);
Expand Down

0 comments on commit 8b8519a

Please sign in to comment.