From: Dmitry Stogov Date: Fri, 10 Oct 2008 15:53:31 +0000 (+0000) Subject: Fixed bug #46246 (difference between call_user_func(array($this, $method)) and $this... X-Git-Tag: php-5.2.7RC2~57 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a1a12497539719c97bc807fe9f40854a2aa1ba6c;p=php Fixed bug #46246 (difference between call_user_func(array($this, $method)) and $this->$method()) --- diff --git a/NEWS b/NEWS index 73145a3d3e..980b34d3cc 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? Oct 2008, PHP 5.2.7RC2 +- Fixed bug #46246 (difference between call_user_func(array($this, $method)) + and $this->$method()). (Dmitry) - Fixed bug #44251, #41125 (PDO + quote() + prepare() can result in seg fault). (tsteiner at nerdclub dot net) diff --git a/Zend/tests/bug46246.phpt b/Zend/tests/bug46246.phpt new file mode 100644 index 0000000000..a57222bf2a --- /dev/null +++ b/Zend/tests/bug46246.phpt @@ -0,0 +1,40 @@ +--TEST-- +Bug #46246 (difference between call_user_func(array($this, $method)) and $this->$method()) +--FILE-- +Test(); + $this->$method(); + call_user_func(array($this, $method)); + } +} + +class B extends A +{ + protected function Test() + { + echo 'Overridden hello from '.get_class($this)."\n"; + } +} + +$a = new A; +$b = new B; + +$a->call('Test'); +$b->call('Test'); +?> +--EXPECT-- +Hello from A +Hello from A +Hello from A +Hello from B +Hello from B +Hello from B diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index dec7f67fe2..07a42b5d34 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -824,7 +824,9 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS } EX(function_state).function = Z_OBJ_HT_PP(fci->object_pp)->get_method(fci->object_pp, fname, fname_len TSRMLS_CC); - if (EX(function_state).function && calling_scope != EX(function_state).function->common.scope) { + if (EX(function_state).function && + (EX(function_state).function->common.fn_flags & ZEND_ACC_PRIVATE) == 0 && + calling_scope != EX(function_state).function->common.scope) { char *function_name_lc = zend_str_tolower_dup(fname, fname_len); if (zend_hash_find(&calling_scope->function_table, function_name_lc, fname_len+1, (void **) &EX(function_state).function)==FAILURE) { efree(function_name_lc);