Fixed bug #44141 (private parent constructor callable through static function)

This commit is contained in:
Dmitry Stogov 2008-02-21 13:55:45 +00:00
parent 9609e195e9
commit 3e7e9d4af6
2 changed files with 26 additions and 1 deletions

25
Zend/tests/bug44141.phpt Normal file
View File

@ -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

View File

@ -1025,7 +1025,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 %s::%s() from context '%s'", constructor->common.scope->name, constructor->common.function_name, EG(scope)->name);
} else {