[php-src] Issue #9090: FFI `Incompatible types when assigning to type 'void(*)()' from type 'void(*)()'`
| From: | adsr | Date: | Fri, 22 Jul 2022 00:11:34 +0000 |
| Subject: | [php-src] Issue #9090: FFI `Incompatible types when assigning to type 'void(*)()' from type 'void(*)()'` | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-241975@lists.php.net to get a copy of this message | ||
Issue: https://github.com/php/php-src/issues/9090
Author: adsr
### Description
It appears we're unable to assign a function pointer via FFI:
```
$ cat ffibug.c
#include <stdio.h>
void func() {
printf("hello\n");
}
void (*func_ptr)() = NULL;
void call_func() {
if (func_ptr != NULL) func_ptr();
}
$ gcc -shared -fPIC -o libffibug.so ffibug.c
$ php -v
PHP 8.2.0-dev (cli) (built: Jul 19 2022 20:25:19) (NTS DEBUG)
Copyright (c) The PHP Group
Zend Engine v4.2.0-dev, Copyright (c) Zend Technologies
$ php -a
Interactive shell
php > $ffi = FFI::cdef('void func(); void (*func_ptr)(); void call_func();', __DIR__ .
'/libffibug.so');
php > $ffi->call_func();
php > $ffi->func_ptr = $ffi->func;
Warning: Uncaught FFI\Exception: Incompatible types when assigning to type 'void(*)()'
from type 'void(*)()' in php shell code:1
Stack trace:
#0 {main}
thrown in php shell code on line 1
php >
```
The following patch seems to fix:
```diff
diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c
index cb82c3a3c3..3cd568826f 100644
--- a/ext/ffi/ffi.c
+++ b/ext/ffi/ffi.c
@@ -267,7 +267,8 @@ static bool zend_ffi_is_compatible_type(zend_ffi_type *dst_type, zend_ffi_type *
dst_type = ZEND_FFI_TYPE(dst_type->pointer.type);
src_type = ZEND_FFI_TYPE(src_type->pointer.type);
if (dst_type->kind == ZEND_FFI_TYPE_VOID ||
- src_type->kind == ZEND_FFI_TYPE_VOID) {
+ src_type->kind == ZEND_FFI_TYPE_VOID ||
+ src_type->kind == dst_type->kind) {
return 1;
}
} else if (dst_type->kind == ZEND_FFI_TYPE_ARRAY &&
```
```
$ php -a
Interactive shell
php > $ffi = FFI::cdef('void func(); void (*func_ptr)(); void call_func();', __DIR__ .
'/libffibug.so');
php > $ffi->call_func();
php > $ffi->func_ptr = $ffi->func;
php > $ffi->call_func();
hello
php >
$
```
I'm not familiar with FFI internals so could use a review. FFI tests continue to pass at least.
If it looks ok I can follow up with a PR + phpt.
### PHP Version
HEAD
### Operating System
Debian testing