gh-145623: Fix crashes on uninitialized struct.Struct objects (gh-145624)

This commit is contained in:
Ramin Farajpour Cami
2026-03-07 17:01:45 +03:30
committed by GitHub
parent 0aeaaafac4
commit 2cf6b2caad
3 changed files with 7 additions and 0 deletions
+2
View File
@@ -836,6 +836,8 @@ class StructTest(ComplexesAreIdenticalMixin, unittest.TestCase):
self.assertRaises(RuntimeError, S.unpack, spam)
self.assertRaises(RuntimeError, S.unpack_from, spam)
self.assertRaises(RuntimeError, getattr, S, 'format')
self.assertRaises(RuntimeError, S.__sizeof__)
self.assertRaises(RuntimeError, repr, S)
self.assertEqual(S.size, -1)
@@ -0,0 +1,3 @@
Fix crash in :mod:`struct` when calling :func:`repr` or
``__sizeof__()`` on an uninitialized :class:`struct.Struct`
object created via ``Struct.__new__()`` without calling ``__init__()``.
+2
View File
@@ -2382,6 +2382,7 @@ static PyObject *
Struct___sizeof___impl(PyStructObject *self)
/*[clinic end generated code: output=2d0d78900b4cdb4e input=faca5925c1f1ffd0]*/
{
ENSURE_STRUCT_IS_READY(self);
size_t size = _PyObject_SIZE(Py_TYPE(self)) + sizeof(formatcode);
for (formatcode *code = self->s_codes; code->fmtdef != NULL; code++) {
size += sizeof(formatcode);
@@ -2393,6 +2394,7 @@ static PyObject *
s_repr(PyObject *op)
{
PyStructObject *self = PyStructObject_CAST(op);
ENSURE_STRUCT_IS_READY(self);
PyObject* fmt = PyUnicode_FromStringAndSize(
PyBytes_AS_STRING(self->s_format), PyBytes_GET_SIZE(self->s_format));
if (fmt == NULL) {