]> granicus.if.org Git - php/commitdiff
Fixed bug #34893 (PHP5.1 overloading, Cannot access private property)
authorDmitry Stogov <dmitry@php.net>
Thu, 20 Oct 2005 09:47:31 +0000 (09:47 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 20 Oct 2005 09:47:31 +0000 (09:47 +0000)
Zend/tests/bug34893.phpt [new file with mode: 0755]
Zend/zend_object_handlers.c

diff --git a/Zend/tests/bug34893.phpt b/Zend/tests/bug34893.phpt
new file mode 100755 (executable)
index 0000000..bbe0235
--- /dev/null
@@ -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
index 3940d3f433022040c38c80854ee48a041538f085..2dd0238182f6a09523776e70a41932349bd77e66 100644 (file)
@@ -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);