summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2019-10-22 11:33:00 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2019-10-22 11:38:58 +0200
commit1c9bfcb6a766d4062f2dd1e594b30831d59cc36c (patch)
treee70bcda55d73d579fcb5f12fffbfd2fee1131f6f
parent6422c956337bed1e22403da4dd79c713ecfe6bc6 (diff)
downloadphp-git-1c9bfcb6a766d4062f2dd1e594b30831d59cc36c.tar.gz
Fix #78716: Function name mangling is wrong for some parameter types
We have to cater to function parameter alignment when calculating the parameter size.
-rw-r--r--NEWS4
-rw-r--r--ext/ffi/ffi.c2
-rw-r--r--ext/ffi/tests/callconv.phpt30
-rw-r--r--ext/ffi/tests/callconv_x86.dllbin8704 -> 8704 bytes
4 files changed, 20 insertions, 16 deletions
diff --git a/NEWS b/NEWS
index a192b92ea4..5003143e92 100644
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,10 @@ PHP NEWS
- Date:
. Fixed bug #70153 (\DateInterval incorrectly unserialized). (Maksim Iakunin)
+- FFI:
+ . Fixed bug #78716 (Function name mangling is wrong for some parameter
+ types). (cmb)
+
- FPM:
. Fixed bug #78599 (env_path_info underflow in fpm_main.c can lead to RCE).
(CVE-2019-11043) (Jakub Zelenka)
diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c
index 1d6f84b6b2..1edba157a1 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 aa481de224..233c73f110 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');
diff --git a/ext/ffi/tests/callconv_x86.dll b/ext/ffi/tests/callconv_x86.dll
index f4818d1091..f13446ee4e 100644
--- a/ext/ffi/tests/callconv_x86.dll
+++ b/ext/ffi/tests/callconv_x86.dll
Binary files differ