Skip to content

Commit 7c624d4

Browse files
authored
[3.14] gh-145623: Fix crashes on uninitialized struct.Struct objects (gh-145624) (GH-145630)
1 parent 3844054 commit 7c624d4

File tree

3 files changed

+7
-0
lines changed

3 files changed

+7
-0
lines changed

Lib/test/test_struct.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,8 @@ def test_operations_on_half_initialized_Struct(self):
836836
self.assertRaises(RuntimeError, S.unpack, spam)
837837
self.assertRaises(RuntimeError, S.unpack_from, spam)
838838
self.assertRaises(RuntimeError, getattr, S, 'format')
839+
self.assertRaises(RuntimeError, S.__sizeof__)
840+
self.assertRaises(RuntimeError, repr, S)
839841
self.assertEqual(S.size, -1)
840842

841843

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix crash in :mod:`struct` when calling :func:`repr` or
2+
``__sizeof__()`` on an uninitialized :class:`struct.Struct`
3+
object created via ``Struct.__new__()`` without calling ``__init__()``.

Modules/_struct.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2410,6 +2410,7 @@ static PyObject *
24102410
s_sizeof(PyObject *op, PyObject *Py_UNUSED(dummy))
24112411
{
24122412
PyStructObject *self = PyStructObject_CAST(op);
2413+
ENSURE_STRUCT_IS_READY(self);
24132414
size_t size = _PyObject_SIZE(Py_TYPE(self)) + sizeof(formatcode);
24142415
for (formatcode *code = self->s_codes; code->fmtdef != NULL; code++) {
24152416
size += sizeof(formatcode);
@@ -2421,6 +2422,7 @@ static PyObject *
24212422
s_repr(PyObject *op)
24222423
{
24232424
PyStructObject *self = PyStructObject_CAST(op);
2425+
ENSURE_STRUCT_IS_READY(self);
24242426
PyObject* fmt = PyUnicode_FromStringAndSize(
24252427
PyBytes_AS_STRING(self->s_format), PyBytes_GET_SIZE(self->s_format));
24262428
if (fmt == NULL) {

0 commit comments

Comments
 (0)