]> 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:09 +0000 (10:32 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 12 Jul 2007 10:32:09 +0000 (10:32 +0000)
NEWS
Zend/tests/bug41961.phpt [new file with mode: 0755]
Zend/zend_object_handlers.c

diff --git a/NEWS b/NEWS
index e3d6a5c82dd7e348192635af66ddc396469bbece..54a0b45ea9c1938a30a35cc9a852004e4760987e 100644 (file)
--- 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 (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 1168b5dfb12acbb3fe5ae3a46054531a30e92f45..325675a0ea3b65097d72e772e86e47151246301c 100644 (file)
@@ -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