diff --git a/Lib/test/test_ctypes/test_funcptr.py b/Lib/test/test_ctypes/test_funcptr.py index b4c27809b5333d..b90f019dc67bed 100644 --- a/Lib/test/test_ctypes/test_funcptr.py +++ b/Lib/test/test_ctypes/test_funcptr.py @@ -199,6 +199,14 @@ def test_wrap_dll_function_str_ann(self): version = wrap_str_ann.Py_GetVersion() self.assertIsInstance(version, bytes) + def test_invalid_argtypes(self): + libc = CDLL(None) + + PRINTF_PROTO = CFUNCTYPE(c_int, ctypes.c_char_p) + c_printf = PRINTF_PROTO(("printf", libc), ((1,),)) + c_printf.argtypes = (c_char_p, c_int) + with self.assertRaises(TypeError): + c_printf(b"Hello\n") if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2025-08-27-01-04-38.gh-issue-138008.iCEhZ9.rst b/Misc/NEWS.d/next/Library/2025-08-27-01-04-38.gh-issue-138008.iCEhZ9.rst new file mode 100644 index 00000000000000..53e394547de84a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-27-01-04-38.gh-issue-138008.iCEhZ9.rst @@ -0,0 +1 @@ +Fix segfaults in _cyptes during _build_callargs. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index ae49cbf3e57da7..f6bf40c07169a4 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -4382,7 +4382,11 @@ _build_callargs(ctypes_state *st, PyCFuncPtrObject *self, PyObject *argtypes, callargs = PyTuple_New(len); /* the argument tuple we build */ if (callargs == NULL) return NULL; - + if (!_validate_paramflags(st, Py_TYPE(self), paramflags, argtypes)) { + PyErr_SetString(PyExc_TypeError, + "the current argument is invalid"); + goto error; + } #ifdef MS_WIN32 /* For a COM method, skip the first arg */ if (self->index) {