summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-10-25 10:27:45 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-10-25 10:27:45 +0200
commitbd7b1afd6eb623a4905673dfc92bb0de62f23edd (patch)
treef5e3080d2e34b0e31cba2cac0be233c5add930f9
parent296269cfe81e7580e03701be3eecc0243ba8522a (diff)
downloadphp-git-bd7b1afd6eb623a4905673dfc92bb0de62f23edd.tar.gz
Check type is set when verifying variadic args
Weird that there was no test for this... This code is somewhat inefficient, because it will be performed for every arg, rather than only once.
-rw-r--r--Zend/tests/bug67938.phpt2
-rw-r--r--Zend/zend_execute.c3
2 files changed, 4 insertions, 1 deletions
diff --git a/Zend/tests/bug67938.phpt b/Zend/tests/bug67938.phpt
index 6597c4895f..fc8a9ab517 100644
--- a/Zend/tests/bug67938.phpt
+++ b/Zend/tests/bug67938.phpt
@@ -20,8 +20,10 @@ class Test implements TestInterface {
$obj = new Test;
$obj->foo();
$obj->bar([]);
+$obj->bar([], 1);
?>
--EXPECT--
Test::foo
Test::bar
+Test::bar
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 7544742cd7..673840ace5 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1042,7 +1042,8 @@ static zend_always_inline int zend_verify_variadic_arg_type(zend_function *zf, u
ZEND_ASSERT(zf->common.fn_flags & ZEND_ACC_VARIADIC);
cur_arg_info = &zf->common.arg_info[zf->common.num_args];
- if (UNEXPECTED(!zend_check_type(cur_arg_info->type, arg, cache_slot, zf->common.scope, 0, 0))) {
+ if (ZEND_TYPE_IS_SET(cur_arg_info->type)
+ && UNEXPECTED(!zend_check_type(cur_arg_info->type, arg, cache_slot, zf->common.scope, 0, 0))) {
zend_verify_arg_error(zf, cur_arg_info, arg_num, cache_slot, arg);
return 0;
}