From 1b035d9699aaebbe4f1ca096345d538caa07907a Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 14 Apr 2022 07:27:01 -0700 Subject: gh-91353: Fix void return type handling in ctypes (GH-32246) --- .../Core and Builtins/2022-04-03-17-21-04.bpo-47197.Ji_c30.rst | 5 +++++ Modules/_ctypes/callbacks.c | 2 +- Modules/_ctypes/callproc.c | 7 ++++++- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2022-04-03-17-21-04.bpo-47197.Ji_c30.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-03-17-21-04.bpo-47197.Ji_c30.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-03-17-21-04.bpo-47197.Ji_c30.rst new file mode 100644 index 0000000..697b07d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-04-03-17-21-04.bpo-47197.Ji_c30.rst @@ -0,0 +1,5 @@ +ctypes used to mishandle ``void`` return types, so that for instance a +function declared like ``ctypes.CFUNCTYPE(None, ctypes.c_int)`` would be +called with signature ``int f(int)`` instead of ``void f(int)``. Wasm +targets require function pointers to be called with the correct signatures +so this led to crashes. The problem is now fixed. diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index bb59456..7dd1f99 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -399,7 +399,7 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable, #endif result = ffi_prep_cif(&p->cif, cc, Py_SAFE_DOWNCAST(nargs, Py_ssize_t, int), - _ctypes_get_ffi_type(restype), + p->ffi_restype, &p->atypes[0]); if (result != FFI_OK) { PyErr_Format(PyExc_RuntimeError, diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 4a6b8ec..720c4c0 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1209,7 +1209,12 @@ PyObject *_ctypes_callproc(PPROC pProc, } } - rtype = _ctypes_get_ffi_type(restype); + if (restype == Py_None) { + rtype = &ffi_type_void; + } else { + rtype = _ctypes_get_ffi_type(restype); + } + resbuf = alloca(max(rtype->size, sizeof(ffi_arg))); #ifdef _Py_MEMORY_SANITIZER -- cgit v0.12