diff options
Diffstat (limited to '1c9bfcb6a766d4062f2dd1e594b30831d59cc36c.patch')
-rw-r--r-- | 1c9bfcb6a766d4062f2dd1e594b30831d59cc36c.patch | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/1c9bfcb6a766d4062f2dd1e594b30831d59cc36c.patch b/1c9bfcb6a766d4062f2dd1e594b30831d59cc36c.patch new file mode 100644 index 0000000..cc43800 --- /dev/null +++ b/1c9bfcb6a766d4062f2dd1e594b30831d59cc36c.patch @@ -0,0 +1,81 @@ +From 1c9bfcb6a766d4062f2dd1e594b30831d59cc36c Mon Sep 17 00:00:00 2001 +From: "Christoph M. Becker" <cmbecker69@gmx.de> +Date: Tue, 22 Oct 2019 11:33:00 +0200 +Subject: [PATCH] Fix #78716: Function name mangling is wrong for some + parameter types + +We have to cater to function parameter alignment when calculating the +parameter size. +--- + NEWS | 4 ++++ + ext/ffi/ffi.c | 2 +- + ext/ffi/tests/callconv.phpt | 30 +++++++++++++++--------------- + ext/ffi/tests/callconv_x86.dll | Bin 8704 -> 8704 bytes + 4 files changed, 20 insertions(+), 16 deletions(-) + +diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c +index 1d6f84b6b223..1edba157a171 100644 +--- a/ext/ffi/ffi.c ++++ b/ext/ffi/ffi.c +@@ -775,7 +775,7 @@ static size_t zend_ffi_arg_size(zend_ffi_type *type) /* {{{ */ + size_t arg_size = 0; + + ZEND_HASH_FOREACH_PTR(type->func.args, arg_type) { +- arg_size += ZEND_FFI_TYPE(arg_type)->size; ++ arg_size += MAX(ZEND_FFI_TYPE(arg_type)->size, sizeof(size_t)); + } ZEND_HASH_FOREACH_END(); + return arg_size; + } +diff --git a/ext/ffi/tests/callconv.phpt b/ext/ffi/tests/callconv.phpt +index aa481de2249c..233c73f11010 100644 +--- a/ext/ffi/tests/callconv.phpt ++++ b/ext/ffi/tests/callconv.phpt +@@ -9,32 +9,32 @@ if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platforms only"); + --FILE-- + <?php + $header = <<<HEADER +-void __cdecl cdecl_func(int arg1, double arg2); +-void __stdcall stdcall_func(int arg1, double arg2); +-void __fastcall fastcall_func(int arg1, double arg2); ++void __cdecl cdecl_func(int arg1, double arg2, char arg3); ++void __stdcall stdcall_func(int arg1, double arg2, char arg3); ++void __fastcall fastcall_func(int arg1, double arg2, char arg3); + HEADER; + $headername = __DIR__ . '/callconv.h'; + $dllname = __DIR__ . "/callconv_x86.dll"; + + $ffi1 = FFI::cdef($header, $dllname); +-$ffi1->cdecl_func(1, 2.3); +-$ffi1->stdcall_func(4, 5.6); +-$ffi1->fastcall_func(7, 8.9); ++$ffi1->cdecl_func(1, 2.3, 'a'); ++$ffi1->stdcall_func(4, 5.6, 'b'); ++$ffi1->fastcall_func(7, 8.9, 'c'); + + file_put_contents($headername, "#define FFI_LIB \"$dllname\"\n$header"); + + $ffi2 = FFI::load($headername); +-$ffi2->cdecl_func(2, 3.4); +-$ffi2->stdcall_func(5, 6.7); +-$ffi2->fastcall_func(8, 9.1); ++$ffi2->cdecl_func(2, 3.4, 'a'); ++$ffi2->stdcall_func(5, 6.7, 'b'); ++$ffi2->fastcall_func(8, 9.1, 'c'); + ?> + --EXPECT-- +-cdecl: 1, 2.300000 +-stdcall: 4, 5.600000 +-fastcall: 7, 8.900000 +-cdecl: 2, 3.400000 +-stdcall: 5, 6.700000 +-fastcall: 8, 9.100000 ++cdecl: 1, 2.300000, a ++stdcall: 4, 5.600000, b ++fastcall: 7, 8.900000, c ++cdecl: 2, 3.400000, a ++stdcall: 5, 6.700000, b ++fastcall: 8, 9.100000, c + --CLEAN-- + <?php + unlink(__DIR__ . '/callconv.h'); + |