From 5372281b013a3b5d325013058e4a55a7a9950a1e Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 20 Oct 2005 09:47:31 +0000 Subject: [PATCH] Fixed bug #34893 (PHP5.1 overloading, Cannot access private property) --- Zend/tests/bug34893.phpt | 33 +++++++++++++++++++++++++++++++++ Zend/zend_object_handlers.c | 8 +++++--- 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100755 Zend/tests/bug34893.phpt 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 3940d3f433..2dd0238182 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -490,8 +490,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_UNICODE && (UG(unicode) || member->type != IS_STRING)) { tmp_member = *member; @@ -504,12 +506,12 @@ static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member TSRMLS_DC fprintf(stderr, "Ptr object #%d property: %R\n", Z_OBJ_HANDLE_P(object), Z_TYPE_P(member), 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_u_hash_quick_find(zobj->properties, Z_TYPE_P(member), property_info->name, property_info->name_length+1, property_info->h, (void **) &retval) == FAILURE) { + if (!property_info || zend_u_hash_quick_find(zobj->properties, Z_TYPE_P(member), 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); -- 2.50.1