Skip to content

Commit b289462

Browse files
authored
[3.13] gh-145623: Fix crashes on uninitialized struct.Struct objects (gh-145624) (GH-145631)
1 parent fd7da76 commit b289462

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
@@ -806,6 +806,8 @@ def test_operations_on_half_initialized_Struct(self):
806806
self.assertRaises(RuntimeError, S.unpack, spam)
807807
self.assertRaises(RuntimeError, S.unpack_from, spam)
808808
self.assertRaises(RuntimeError, getattr, S, 'format')
809+
self.assertRaises(RuntimeError, S.__sizeof__)
810+
self.assertRaises(RuntimeError, repr, S)
809811
self.assertEqual(S.size, -1)
810812

811813

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
@@ -2196,6 +2196,7 @@ PyDoc_STRVAR(s_sizeof__doc__,
21962196
static PyObject *
21972197
s_sizeof(PyStructObject *self, void *unused)
21982198
{
2199+
ENSURE_STRUCT_IS_READY(self);
21992200
size_t size = _PyObject_SIZE(Py_TYPE(self)) + sizeof(formatcode);
22002201
for (formatcode *code = self->s_codes; code->fmtdef != NULL; code++) {
22012202
size += sizeof(formatcode);
@@ -2206,6 +2207,7 @@ s_sizeof(PyStructObject *self, void *unused)
22062207
static PyObject *
22072208
s_repr(PyStructObject *self)
22082209
{
2210+
ENSURE_STRUCT_IS_READY(self);
22092211
PyObject* fmt = PyUnicode_FromStringAndSize(
22102212
PyBytes_AS_STRING(self->s_format), PyBytes_GET_SIZE(self->s_format));
22112213
if (fmt == NULL) {

0 commit comments

Comments
 (0)