]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-91353: Fix void return type handling in ctypes (GH-32246)
authorHood Chatham <roberthoodchatham@gmail.com>
Thu, 14 Apr 2022 14:27:01 +0000 (07:27 -0700)
committerGitHub <noreply@github.com>
Thu, 14 Apr 2022 14:27:01 +0000 (16:27 +0200)
Misc/NEWS.d/next/Core and Builtins/2022-04-03-17-21-04.bpo-47197.Ji_c30.rst [new file with mode: 0644]
Modules/_ctypes/callbacks.c
Modules/_ctypes/callproc.c

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 (file)
index 0000000..697b07d
--- /dev/null
@@ -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.
index bb59456a7321a2376decfd7014fdab2a4f325d5c..7dd1f99021a7f245931bd968b3bbcaea8d71eeac 100644 (file)
@@ -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,
index 4a6b8ec3ee016f202de3cce8316beada4a629615..720c4c09f538f76a110a021be034ef6eedaee286 100644 (file)
@@ -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