]> granicus.if.org Git - php/commitdiff
Check type is set when verifying variadic args
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 25 Oct 2019 08:27:45 +0000 (10:27 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 25 Oct 2019 08:27:45 +0000 (10:27 +0200)
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.

Zend/tests/bug67938.phpt
Zend/zend_execute.c

index 6597c4895fc24e993fe4295464871bcad99ccbc6..fc8a9ab51759065f2443c942403f4047930e190a 100644 (file)
@@ -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
index 7544742cd765ce21a80488eed10d61b22fa8c6ee..673840ace5babe1076c133756e1eacf58159c66d 100644 (file)
@@ -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;
        }