]> granicus.if.org Git - php/commitdiff
Fixed bug #44141 (private parent constructor callable through static function)
authorDmitry Stogov <dmitry@php.net>
Thu, 21 Feb 2008 13:55:55 +0000 (13:55 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 21 Feb 2008 13:55:55 +0000 (13:55 +0000)
Zend/tests/bug44141.phpt [new file with mode: 0644]
Zend/zend_object_handlers.c

diff --git a/Zend/tests/bug44141.phpt b/Zend/tests/bug44141.phpt
new file mode 100644 (file)
index 0000000..1a9ee89
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Bug #44141 (private parent constructor callable through static function)
+--FILE--
+<?php
+class X
+{
+        public $x;
+        private function __construct($x)
+        {
+                $this->x = $x;
+        }
+}
+
+class Y extends X
+{
+        static public function cheat($x)
+        {
+                return new Y($x);
+        }
+}
+
+$y = Y::cheat(5);
+echo $y->x, PHP_EOL;
+--EXPECTF--
+Fatal error: Call to private X::__construct() from context 'Y' in %sbug44141.php on line 15
index d9f1b27b95153abeff9ef04728033d1f989c300c..09ec4a7fea4b57bd230d7d54c8e261dc1ae2bf9a 100644 (file)
@@ -1052,7 +1052,7 @@ ZEND_API union _zend_function *zend_std_get_constructor(zval *object TSRMLS_DC)
                } else if (constructor->op_array.fn_flags & ZEND_ACC_PRIVATE) {
                        /* Ensure that if we're calling a private function, we're allowed to do so.
                         */
-                       if (Z_OBJ_HANDLER_P(object, get_class_entry)(object TSRMLS_CC) != EG(scope)) {
+                       if (constructor->common.scope != EG(scope)) {
                                if (EG(scope)) {
                                        zend_error(E_ERROR, "Call to private %v::%v() from context '%v'", constructor->common.scope->name, constructor->common.function_name, EG(scope)->name);
                                } else {