diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2019-10-22 11:33:00 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2019-10-22 11:38:58 +0200 |
commit | 1c9bfcb6a766d4062f2dd1e594b30831d59cc36c (patch) | |
tree | e70bcda55d73d579fcb5f12fffbfd2fee1131f6f | |
parent | 6422c956337bed1e22403da4dd79c713ecfe6bc6 (diff) | |
download | php-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-- | NEWS | 4 | ||||
-rw-r--r-- | ext/ffi/ffi.c | 2 | ||||
-rw-r--r-- | ext/ffi/tests/callconv.phpt | 30 | ||||
-rw-r--r-- | ext/ffi/tests/callconv_x86.dll | bin | 8704 -> 8704 bytes |
4 files changed, 20 insertions, 16 deletions
@@ -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 Binary files differindex f4818d1091..f13446ee4e 100644 --- a/ext/ffi/tests/callconv_x86.dll +++ b/ext/ffi/tests/callconv_x86.dll |