From: Dmitry Stogov Date: Thu, 20 Oct 2005 09:47:12 +0000 (+0000) Subject: Fixed bug #34893 (PHP5.1 overloading, Cannot access private property) X-Git-Tag: php-5.1.0RC4~62 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a8c338aa65c1fc48b53e67c95a9dd33b07d60486;p=php Fixed bug #34893 (PHP5.1 overloading, Cannot access private property) --- diff --git a/NEWS b/NEWS index 93d00d02c3..32de2e4ef4 100644 --- a/NEWS +++ b/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) diff --git a/Zend/tests/bug34893.phpt b/Zend/tests/bug34893.phpt new file mode 100755 index 0000000000..bbe02358e9 --- /dev/null +++ b/Zend/tests/bug34893.phpt @@ -0,0 +1,33 @@ +--TEST-- +Bug #34893 (PHP5.1 overloading, Cannot access private property) +--FILE-- +$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 diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 89cf73686a..49b5e1d6cf 100644 --- a/Zend/zend_object_handlers.c +++ b/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);