From: Dmitry Stogov Date: Thu, 12 Jul 2007 10:32:09 +0000 (+0000) Subject: Fixed bug #41961 (Ensure search for hidden private methods does not stray from class... X-Git-Tag: php-5.2.4RC1~171 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ed10530eb5aff14faf80a19909fc47f611f5befa;p=php Fixed bug #41961 (Ensure search for hidden private methods does not stray from class hierarchy). (robin_fernandes at uk dot ibm dot com) --- diff --git a/NEWS b/NEWS index e3d6a5c82d..54a0b45ea9 100644 --- a/NEWS +++ b/NEWS @@ -58,6 +58,8 @@ PHP NEWS - Fixed PECL bug #11216 (crash in ZipArchive::addEmptyDir when a directory already exists). (Pierre) +- Fixed bug #41961 (Ensure search for hidden private methods does not stray + from class hierarchy). (robin_fernandes at uk dot ibm dot com) - Fixed bug #41947 (SimpleXML incorrectly registers empty strings as namespaces). (Rob) - Fixed bug #41919 (crash in string to array conversion). diff --git a/Zend/tests/bug41961.phpt b/Zend/tests/bug41961.phpt new file mode 100755 index 0000000000..514265b601 --- /dev/null +++ b/Zend/tests/bug41961.phpt @@ -0,0 +1,29 @@ +--TEST-- +Bug #41961 (Ensure search for hidden private methods does not stray from class hierarchy) +--FILE-- +secret(); // bug - invokes X::secret() instead of ChildClass::secret() + } + private function secret() { + echo "Called private " . __METHOD__ . "() on an instance of: " . get_class($this) . "\n"; + } +} + +class ParentClass { + private function secret() { } +} + +class ChildClass extends ParentClass { + public function secret() { + echo "Called public " . __METHOD__ . "() on an instance of: " . get_class($this) . "\n"; + } +} +?> +--EXPECT-- +Called public ChildClass::secret() on an instance of: ChildClass diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 1168b5dfb1..325675a0ea 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -800,7 +800,9 @@ static union _zend_function *zend_std_get_method(zval **object_ptr, char *method /* Ensure that we haven't overridden a private function and end up calling * the overriding public function... */ - if (EG(scope) && fbc->op_array.fn_flags & ZEND_ACC_CHANGED) { + if (EG(scope) && + is_derived_class(fbc->common.scope, EG(scope)) && + fbc->op_array.fn_flags & ZEND_ACC_CHANGED) { zend_function *priv_fbc; if (zend_hash_find(&EG(scope)->function_table, lc_method_name, method_len+1, (void **) &priv_fbc)==SUCCESS