]> granicus.if.org Git - php/commitdiff
Fixed bug #41961 (Ensure search for hidden private methods does not stray from class...
authorDmitry Stogov <dmitry@php.net>
Thu, 12 Jul 2007 10:32:26 +0000 (10:32 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 12 Jul 2007 10:32:26 +0000 (10:32 +0000)
Zend/tests/bug41961.phpt [new file with mode: 0755]
Zend/zend_object_handlers.c

diff --git a/Zend/tests/bug41961.phpt b/Zend/tests/bug41961.phpt
new file mode 100755 (executable)
index 0000000..514265b
--- /dev/null
@@ -0,0 +1,29 @@
+--TEST--
+Bug #41961 (Ensure search for hidden private methods does not stray from class hierarchy)
+--FILE--
+<?php
+X::test();
+/** Class X is related to neither ParentClass nor ChildClass. */
+class X {
+  public static function test() {
+    $myChild = new ChildClass;  
+    $myChild->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
index 89054196bbe5f2c6575a61cbecfc5d72dd784913..3a893f8dcbe88b8d9d682dca6ab76c1c7b046424 100644 (file)
@@ -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