diff options
author | Nikita Sobolev <mail@sobolevn.me> | 2022-11-13 19:22:45 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-13 19:22:45 (GMT) |
commit | 343eb0f94b26f2a4c1c15505d417e8157ec19660 (patch) | |
tree | 7d0f28d4f922856a07575c1d4976a91b46ff9820 | |
parent | d329f859b9cea9e6fa76fdf03927f659cf17786b (diff) | |
download | cpython-343eb0f94b26f2a4c1c15505d417e8157ec19660.zip cpython-343eb0f94b26f2a4c1c15505d417e8157ec19660.tar.gz cpython-343eb0f94b26f2a4c1c15505d417e8157ec19660.tar.bz2 |
gh-99275: Fix `SystemError` in `ctypes` during `__initsubclass__` (#99283)
-rw-r--r-- | Lib/test/test_ctypes/test_struct_fields.py | 9 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2022-11-09-12-16-35.gh-issue-99275.klOqoL.rst | 2 | ||||
-rw-r--r-- | Modules/_ctypes/stgdict.c | 5 |
3 files changed, 15 insertions, 1 deletions
diff --git a/Lib/test/test_ctypes/test_struct_fields.py b/Lib/test/test_ctypes/test_struct_fields.py index ee8415f..fefeaea 100644 --- a/Lib/test/test_ctypes/test_struct_fields.py +++ b/Lib/test/test_ctypes/test_struct_fields.py @@ -54,6 +54,15 @@ class StructFieldsTestCase(unittest.TestCase): x.char = b'a\0b\0' self.assertEqual(bytes(x), b'a\x00###') + def test_gh99275(self): + class BrokenStructure(Structure): + def __init_subclass__(cls, **kwargs): + cls._fields_ = [] # This line will fail, `stgdict` is not ready + + with self.assertRaisesRegex(TypeError, + 'ctypes state is not initialized'): + class Subclass(BrokenStructure): ... + # __set__ and __get__ should raise a TypeError in case their self # argument is not a ctype instance. def test___set__(self): diff --git a/Misc/NEWS.d/next/Library/2022-11-09-12-16-35.gh-issue-99275.klOqoL.rst b/Misc/NEWS.d/next/Library/2022-11-09-12-16-35.gh-issue-99275.klOqoL.rst new file mode 100644 index 0000000..2bf05a3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-11-09-12-16-35.gh-issue-99275.klOqoL.rst @@ -0,0 +1,2 @@ +Fix ``SystemError`` in :mod:`ctypes` when exception was not set during +``__initsubclass__``. diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c index 1c69a29..9f031b0 100644 --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -424,8 +424,11 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct } stgdict = PyType_stgdict(type); - if (!stgdict) + if (!stgdict) { + PyErr_SetString(PyExc_TypeError, + "ctypes state is not initialized"); return -1; + } /* If this structure/union is already marked final we cannot assign _fields_ anymore. */ |