summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2014-08-30 20:41:36 +0200
committerNikita Popov <nikic@php.net>2014-08-30 20:43:34 +0200
commitd7368c2531ad1268d43c894b8422a61b70c70e5a (patch)
tree7036fd074fb167f20688cc6970587f83c40a1dab /Zend
parentdaefca44b5ed60b6adb1238babbf3a51e8541404 (diff)
downloadphp-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.phpt27
-rw-r--r--Zend/zend_compile.c2
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;
}