diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 99909de20ef439..a7b2a3af209db8 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -870,6 +870,14 @@ invalid non-\ ``NULL`` pointers would crash Python):: ValueError: NULL pointer access >>> +Converting pointer to iterator causes Python to crash:: + + >>> x = c_int32(54321) + >>> list(pointer(x)) + Traceback (most recent call last): + ... + NotImplementedError: Pointer object does not support iterator + .. _ctypes-type-conversions: diff --git a/Lib/test/test_ctypes/test_pointers.py b/Lib/test/test_ctypes/test_pointers.py index fc558e10ba40c5..db0237855c6b72 100644 --- a/Lib/test/test_ctypes/test_pointers.py +++ b/Lib/test/test_ctypes/test_pointers.py @@ -48,6 +48,11 @@ class A(POINTER(c_ulong)): # Pointer can't set contents: has no _type_ self.assertRaises(TypeError, A, c_ulong(33)) + def test_disable_iter(self): + self.assertRaises(NotImplementedError, list, pointer(c_int(123))) + self.assertRaises(NotImplementedError, set, pointer(c_int(123))) + self.assertRaises(NotImplementedError, tuple, pointer(c_int(123))) + def test_pass_pointers(self): dll = CDLL(_ctypes_test.__file__) func = dll._testfunc_p_p diff --git a/Misc/NEWS.d/next/Library/2024-11-02-10-58-32.gh-issue-126272.SemJLX.rst b/Misc/NEWS.d/next/Library/2024-11-02-10-58-32.gh-issue-126272.SemJLX.rst new file mode 100644 index 00000000000000..72c89183b92ae1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-11-02-10-58-32.gh-issue-126272.SemJLX.rst @@ -0,0 +1 @@ +:exc:`NotImplementedError` error thrown when converting :func:`ctypes.pointer` to iterator. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index eae69e484e1660..e7f088b160540b 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -5477,11 +5477,20 @@ Pointer_bool(CDataObject *self) return (*(void **)self->b_ptr != NULL); } +static PyObject * +Pointer_iter(PyObject *myself) +{ + PyErr_SetString(PyExc_NotImplementedError, + "Pointer object does not support iterator"); + return NULL; +} + static PyType_Slot pycpointer_slots[] = { {Py_tp_doc, PyDoc_STR("XXX to be provided")}, {Py_tp_getset, Pointer_getsets}, {Py_tp_init, Pointer_init}, {Py_tp_new, Pointer_new}, + {Py_tp_iter, Pointer_iter}, {Py_bf_getbuffer, PyCData_NewGetBuffer}, {Py_nb_bool, Pointer_bool}, {Py_mp_subscript, Pointer_subscript},