From 68845c6a83889e57f3f6915daae6e1f22994359b Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 12 Jul 2007 10:32:26 +0000 Subject: [PATCH] Fixed bug #41961 (Ensure search for hidden private methods does not stray from class hierarchy). (robin_fernandes at uk dot ibm dot com) --- Zend/tests/bug41961.phpt | 29 +++++++++++++++++++++++++++++ Zend/zend_object_handlers.c | 4 +++- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100755 Zend/tests/bug41961.phpt 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 89054196bb..3a893f8dcb 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -833,7 +833,9 @@ static union _zend_function *zend_std_get_method(zval **object_ptr, zstr 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_u_hash_find(&EG(scope)->function_table, type, lc_method_name, lc_method_name_len+1, (void **) &priv_fbc)==SUCCESS -- 2.40.0