Browse Source

Fixed bug #34893 (PHP5.1 overloading, Cannot access private property)

PHP-5.1
Dmitry Stogov 21 years ago
parent
commit
a8c338aa65
  1. 2
      NEWS
  2. 33
      Zend/tests/bug34893.phpt
  3. 8
      Zend/zend_object_handlers.c

2
NEWS

@ -3,6 +3,8 @@ PHP NEWS
?? Oct 2005, PHP 5.1 Release Candidate 4
- Fixed bug #34905 (Digest authentication does not work with Apache 1). (Ilia)
- Fixed bug #34902 (mysqli::character_set_name() - undefined method). (Tony)
- Fixed bug #34893 (PHP5.1 overloading, Cannot access private property).
(Dmitry)
- Fixed bug #34899 (Fixed sqlite extension compile failure). (Ilia)
- Fixed bug #34767 (Zend Engine 1 Compatibility not copying objects correctly).
(Dmitry)

33
Zend/tests/bug34893.phpt

@ -0,0 +1,33 @@
--TEST--
Bug #34893 (PHP5.1 overloading, Cannot access private property)
--FILE--
<?php
class A {
private $p;
function __get($name){
return $this->$name;
}
function __set($name, $value) {
$this->$name = $value;
}
}
class B {
private $t;
function __get($name){
return $this->$name;
}
function __set($name, $value) {
$this->$name = $value;
}
}
$a = new A;
$b = new B;
$a->p = $b;
$b->t = "foo";
echo $a->p->t;
$a->p->t = "bar";
echo $a->p->t;
?>
--EXPECT--
foobar

8
Zend/zend_object_handlers.c

@ -482,8 +482,10 @@ static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member TSRMLS_DC
zval tmp_member;
zval **retval;
zend_property_info *property_info;
zend_bool use_get;
zobj = Z_OBJ_P(object);
use_get = (zobj->ce->__get && !zobj->in_get);
if (member->type != IS_STRING) {
tmp_member = *member;
@ -496,12 +498,12 @@ static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member TSRMLS_DC
fprintf(stderr, "Ptr object #%d property: %s\n", Z_OBJ_HANDLE_P(object), Z_STRVAL_P(member));
#endif
property_info = zend_get_property_info(zobj->ce, member, 0 TSRMLS_CC);
property_info = zend_get_property_info(zobj->ce, member, use_get TSRMLS_CC);
if (zend_hash_quick_find(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, (void **) &retval) == FAILURE) {
if (!property_info || zend_hash_quick_find(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, (void **) &retval) == FAILURE) {
zval *new_zval;
if (!zobj->ce->__get && !zobj->ce->__set) {
if (!use_get) {
/* we don't have access controls - will just add it */
new_zval = &EG(uninitialized_zval);

Loading…
Cancel
Save