[php-src] Issue #9090: FFI `Incompatible types when assigning to type 'void(*)()' from type 'void(*)()'`

From: 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

« previous php.bugs (#241975) next »