From: Dmitry Stogov Date: Thu, 21 Feb 2008 13:55:55 +0000 (+0000) Subject: Fixed bug #44141 (private parent constructor callable through static function) X-Git-Tag: RELEASE_2_0_0a1~400 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=918165076443ffc415236291c4722d49429ed7e6;p=php Fixed bug #44141 (private parent constructor callable through static function) --- diff --git a/Zend/tests/bug44141.phpt b/Zend/tests/bug44141.phpt new file mode 100644 index 0000000000..1a9ee892b6 --- /dev/null +++ b/Zend/tests/bug44141.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #44141 (private parent constructor callable through static function) +--FILE-- +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 diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index d9f1b27b95..09ec4a7fea 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -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 {