https://github.com/python/cpython/commit/2cf6b2caade94e75f10363df6f432a3e6515be6c
commit: 2cf6b2caade94e75f10363df6f432a3e6515be6c
branch: main
author: Ramin Farajpour Cami <[email protected]>
committer: corona10 <[email protected]>
date: 2026-03-07T22:31:45+09:00
summary:
gh-145623: Fix crashes on uninitialized struct.Struct objects (gh-145624)
files:
A Misc/NEWS.d/next/Library/2026-03-07-15-00-00.gh-issue-145623.2Y7LzT.rst
M Lib/test/test_struct.py
M Modules/_struct.c
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index aa793a2c223de9..4cbfd7ad8b1e48 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -836,6 +836,8 @@ def test_operations_on_half_initialized_Struct(self):
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)
diff --git
a/Misc/NEWS.d/next/Library/2026-03-07-15-00-00.gh-issue-145623.2Y7LzT.rst
b/Misc/NEWS.d/next/Library/2026-03-07-15-00-00.gh-issue-145623.2Y7LzT.rst
new file mode 100644
index 00000000000000..77b43e79e35860
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-03-07-15-00-00.gh-issue-145623.2Y7LzT.rst
@@ -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__()``.
diff --git a/Modules/_struct.c b/Modules/_struct.c
index ae8a8ffb3c005a..dcc3c7ec63e9e0 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -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) {
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]