diff options
author | Nikita Popov <nikic@php.net> | 2014-08-30 20:41:36 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2014-08-30 20:43:34 +0200 |
commit | d7368c2531ad1268d43c894b8422a61b70c70e5a (patch) | |
tree | 7036fd074fb167f20688cc6970587f83c40a1dab /Zend | |
parent | daefca44b5ed60b6adb1238babbf3a51e8541404 (diff) | |
download | php-git-d7368c2531ad1268d43c894b8422a61b70c70e5a.tar.gz |
Fix bug #67938: Segfault when extending interface method with variadic
We only want to check extra optional args if the proto function is
variadic, not when we're adding extra variadic args.
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/tests/bug67938.phpt | 27 | ||||
-rw-r--r-- | Zend/zend_compile.c | 2 |
2 files changed, 28 insertions, 1 deletions
diff --git a/Zend/tests/bug67938.phpt b/Zend/tests/bug67938.phpt new file mode 100644 index 0000000000..6597c4895f --- /dev/null +++ b/Zend/tests/bug67938.phpt @@ -0,0 +1,27 @@ +--TEST-- +Bug #67938: Segfault when extending interface method with variadic +--FILE-- +<?php + +interface TestInterface { + public function foo(); + public function bar(array $bar); +} + +class Test implements TestInterface { + public function foo(...$args) { + echo __METHOD__, "\n"; + } + public function bar(array $bar, ...$args) { + echo __METHOD__, "\n"; + } +} + +$obj = new Test; +$obj->foo(); +$obj->bar([]); + +?> +--EXPECT-- +Test::foo +Test::bar diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 7c979d56b7..54b01a845b 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3258,7 +3258,7 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c * go through all the parameters of the function and not just those present in the * prototype. */ num_args = proto->common.num_args; - if ((fe->common.fn_flags & ZEND_ACC_VARIADIC) + if ((proto->common.fn_flags & ZEND_ACC_VARIADIC) && fe->common.num_args > proto->common.num_args) { num_args = fe->common.num_args; } |