summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn David Anglin <dave.anglin@bell.net>2022-12-18 14:52:04 -0500
committerJohn David Anglin <dave.anglin@bell.net>2022-12-18 14:52:04 -0500
commita06428ea810576b27774b76c650f83364e6f6e7f (patch)
tree38cab2d4dcb8ab1ce91d6b6f1e0918903f8ca095
parenta8439665e6bc075f85f58d4edb40ca34f4eaa8e6 (diff)
downloadcffi-a06428ea810576b27774b76c650f83364e6f6e7f.tar.gz
Fix the test failures on hppa
A couple of years ago the libffi port for hppa-linux was changed from using a trampoline executed on the stack to the function descriptor technique used by ia64. This doesn't require an executable stack and is simpler. However, function pointers need to have the PLABEL bit set in the pointer. As a result, a simple cast can't be used to convert closure pointers to function pointers. python-cffi uses its own closure allocation so the problem can't be fixed in libffi. I added a macro CFFI_FN to do the conversion. It shouldn't affect other architectures. There is a similar define in libffi. Fixes: https://bugs.debian.org/1024271
-rw-r--r--c/_cffi_backend.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
index d2dc76c..5e1ebe9 100644
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -60,6 +60,13 @@
# endif
#endif
+/* Convert from closure pointer to function pointer. */
+#if defined(__hppa__) && !defined(__LP64__)
+#define CFFI_FN(f) ((void (*)(void))((unsigned int)(f) | 2))
+#else
+#define CFFI_FN(f) ((void (*)(void))f)
+#endif
+
/* Define the following macro ONLY if you trust libffi's version of
* ffi_closure_alloc() more than the code in malloc_closure.h.
@@ -3191,7 +3198,7 @@ cdata_call(CDataObject *cd, PyObject *args, PyObject *kwds)
Py_BEGIN_ALLOW_THREADS
restore_errno();
- ffi_call(&cif_descr->cif, (void (*)(void))(cd->c_data),
+ ffi_call(&cif_descr->cif, (void (*)(void)) CFFI_FN(cd->c_data),
resultdata, buffer_array);
save_errno();
Py_END_ALLOW_THREADS
@@ -6394,7 +6401,7 @@ static PyObject *b_callback(PyObject *self, PyObject *args)
goto error;
Py_INCREF(ct);
cd->head.c_type = ct;
- cd->head.c_data = (char *)closure_exec;
+ cd->head.c_data = (char *)CFFI_FN(closure_exec);
cd->head.c_weakreflist = NULL;
closure->user_data = NULL;
cd->closure = closure;