diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2022-11-13 19:40:18 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-13 19:40:18 (GMT) |
commit | 14c13955c59c15bd58520241ce64e27c68028d64 (patch) | |
tree | 3b74a1fdfb0aa0beaf2aab66f37fd536aac5efec | |
parent | 5324893599bcdab7e8d56fbc6dce32b994f76443 (diff) | |
download | cpython-14c13955c59c15bd58520241ce64e27c68028d64.zip cpython-14c13955c59c15bd58520241ce64e27c68028d64.tar.gz cpython-14c13955c59c15bd58520241ce64e27c68028d64.tar.bz2 |
gh-99275: Fix `SystemError` in `ctypes` during `__initsubclass__` (GH-99283)
(cherry picked from commit 343eb0f94b26f2a4c1c15505d417e8157ec19660)
Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
-rw-r--r-- | Lib/ctypes/test/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/ctypes/test/test_struct_fields.py b/Lib/ctypes/test/test_struct_fields.py index ee8415f..fefeaea 100644 --- a/Lib/ctypes/test/test_struct_fields.py +++ b/Lib/ctypes/test/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 747339d..f9811ac 100644 --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -420,8 +420,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. */ |