-
Notifications
You must be signed in to change notification settings - Fork 7.7k
Commit
(cherry picked from commit 3b9ba7b)
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
--TEST-- | ||
Bug #75573 (Segmentation fault in 7.1.12 and 7.0.26) | ||
--FILE-- | ||
<?php | ||
|
||
class A | ||
{ | ||
var $_stdObject; | ||
function initialize($properties = FALSE) { | ||
$this->_stdObject = $properties ? (object) $properties : new stdClass(); | ||
parent::initialize(); | ||
} | ||
function &__get($property) | ||
{ | ||
if (isset($this->_stdObject->{$property})) { | ||
$retval =& $this->_stdObject->{$property}; | ||
return $retval; | ||
} else { | ||
return NULL; | ||
} | ||
} | ||
function &__set($property, $value) | ||
{ | ||
return $this->_stdObject->{$property} = $value; | ||
} | ||
function __isset($property_name) | ||
{ | ||
return isset($this->_stdObject->{$property_name}); | ||
} | ||
} | ||
|
||
class B extends A | ||
{ | ||
function initialize($properties = array()) | ||
{ | ||
parent::initialize($properties); | ||
} | ||
function &__get($property) | ||
{ | ||
if (isset($this->settings) && isset($this->settings[$property])) { | ||
$retval =& $this->settings[$property]; | ||
return $retval; | ||
} else { | ||
return parent::__get($property); | ||
} | ||
} | ||
} | ||
|
||
$b = new B(); | ||
$b->settings = [ "foo" => "bar", "name" => "abc" ]; | ||
var_dump($b->name); | ||
var_dump($b->settings); | ||
?> | ||
--EXPECTF-- | ||
Warning: Creating default object from empty value in %sbug75573.php on line %d | ||
|
||
Notice: Only variable references should be returned by reference in %sbug75573.php on line %d | ||
string(3) "abc" | ||
array(2) { | ||
["foo"]=> | ||
string(3) "bar" | ||
["name"]=> | ||
string(3) "abc" | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -602,13 +602,13 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ | |
zval_ptr_dtor(&tmp_object); | ||
goto exit; | ||
} else { | ||
zval_ptr_dtor(&tmp_object); | ||
if (Z_STRVAL_P(member)[0] == '\0') { | ||
if (Z_STRLEN_P(member) == 0) { | ||
zend_throw_error(NULL, "Cannot access empty property"); | ||
retval = &EG(uninitialized_zval); | ||
goto exit; | ||
} else { | ||
zval_ptr_dtor(&tmp_object); | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
weltling
Contributor
|
||
zend_throw_error(NULL, "Cannot access property started with '\\0'"); | ||
retval = &EG(uninitialized_zval); | ||
goto exit; | ||
|
Shouldn't this dtor be in both branches (or directly inside the
if (Z_STRVAL_P(member)[0] == '\0')
)?