Skip to content

Commit b73bf7d

Browse files
committed
Fix ext/ffi
FFI passes an integer variadic argument as zend_long, which is int64_t even where size_t is 32-bit. bug_gh9090.phpt read it with %d, which only worked where each variadic argument takes a full 64-bit slot, and shifted the following arguments elsewhere. Read it with %lld where zend_long is 64-bit, and cover passing int64_t variadic arguments.
1 parent 27a698b commit b73bf7d

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

‎ext/ffi/tests/bug_gh9090.phpt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ $func_ptrs = [
3131
$func_argvs = [
3232
[ 'bug_gh9090_void_none', [ ] ],
3333
[ 'bug_gh9090_void_int_char', [ 42, "hello" ] ],
34-
[ 'bug_gh9090_void_int_char_var', [ 42, "d=%d s=%s", -1, "ok" ] ],
34+
[ 'bug_gh9090_void_int_char_var', [ 42, PHP_INT_SIZE === 8 ? "d=%lld s=%s" : "d=%d s=%s", -1, "ok" ] ],
3535
];
3636

3737
foreach ($func_ptrs as $func_ptr) {

‎ext/ffi/tests/variadic_int64.phpt‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
FFI passes integer variadic arguments as int64_t with a 64-bit zend_long
3+
--EXTENSIONS--
4+
ffi
5+
zend_test
6+
--SKIPIF--
7+
<?php
8+
if (PHP_INT_SIZE !== 8) {
9+
die("skip only for a 64-bit zend_long");
10+
}
11+
?>
12+
--FILE--
13+
<?php
14+
$ffi = FFI::cdef('void bug_gh9090_void_int_char_var(int i, char *fmt, ...);');
15+
16+
$ffi->bug_gh9090_void_int_char_var(0, "%lld %lld %lld", 1, 2, 3);
17+
$ffi->bug_gh9090_void_int_char_var(0, "%lld %s", -1, "ok");
18+
$ffi->bug_gh9090_void_int_char_var(0, "%lld %lld %s", 2 ** 32 + 1, -(2 ** 32) - 1, "ok");
19+
$ffi->bug_gh9090_void_int_char_var(0, "%lld %lld %s", PHP_INT_MAX, PHP_INT_MIN, "ok");
20+
$ffi->bug_gh9090_void_int_char_var(0, "%s %lld %.1f %lld", "ok", 1, 2.5, 3);
21+
?>
22+
--EXPECT--
23+
bug_gh9090_void_int_char_var 1 2 3
24+
bug_gh9090_void_int_char_var -1 ok
25+
bug_gh9090_void_int_char_var 4294967297 -4294967297 ok
26+
bug_gh9090_void_int_char_var 9223372036854775807 -9223372036854775808 ok
27+
bug_gh9090_void_int_char_var ok 1 2.5 3

0 commit comments

Comments
 (0)