felipe                                   Sun, 01 Nov 2009 15:12:34 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=290127

Log:
- Fixed bug #49719 (ReflectionClass::hasProperty returns true for a private 
property in base class)

Bug: http://bugs.php.net/49719 (Verified) ReflectionClass::hasProperty returns 
true for a private property in base class
      
Changed paths:
    U   php/php-src/branches/PHP_5_2/NEWS
    U   php/php-src/branches/PHP_5_2/ext/reflection/php_reflection.c
    U   
php/php-src/branches/PHP_5_2/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt
    A   php/php-src/branches/PHP_5_2/ext/reflection/tests/bug49719.phpt
    U   php/php-src/branches/PHP_5_3/NEWS
    U   php/php-src/branches/PHP_5_3/ext/reflection/php_reflection.c
    U   
php/php-src/branches/PHP_5_3/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt
    A   php/php-src/branches/PHP_5_3/ext/reflection/tests/bug49719.phpt
    U   php/php-src/trunk/ext/reflection/php_reflection.c
    U   
php/php-src/trunk/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt
    A   php/php-src/trunk/ext/reflection/tests/bug49719.phpt

Modified: php/php-src/branches/PHP_5_2/NEWS
===================================================================
--- php/php-src/branches/PHP_5_2/NEWS	2009-11-01 13:18:00 UTC (rev 290126)
+++ php/php-src/branches/PHP_5_2/NEWS	2009-11-01 15:12:34 UTC (rev 290127)
@@ -37,6 +37,8 @@
 - Fixed bug #48752 (Crash during date parsing with invalid date). (Pierre)
 - Fixed bug #49738 (calling mcrypt() after mcrypt_generic_deinit() crashes).
   (Sriram Natarajan)
+- Fixed bug #49719 (ReflectionClass::hasProperty returns true for a private
+  property in base class). (Felipe)
 - Fixed bug #49698 (Unexpected change in strnatcasecmp()). (Rasmus)
 - Fixed bug #49647 (DOMUserData does not exist). (Rob)
 - Fixed bug #49630 (imap_listscan() function missing). (Felipe)

Modified: php/php-src/branches/PHP_5_2/ext/reflection/php_reflection.c
===================================================================
--- php/php-src/branches/PHP_5_2/ext/reflection/php_reflection.c	2009-11-01 13:18:00 UTC (rev 290126)
+++ php/php-src/branches/PHP_5_2/ext/reflection/php_reflection.c	2009-11-01 15:12:34 UTC (rev 290127)
@@ -3104,6 +3104,7 @@
 ZEND_METHOD(reflection_class, hasProperty)
 {
 	reflection_object *intern;
+	zend_property_info *property_info;
 	zend_class_entry *ce;
 	char *name;
 	int name_len;
@@ -3115,11 +3116,13 @@
 	}

 	GET_REFLECTION_OBJECT_PTR(ce);
-	if (zend_hash_exists(&ce->properties_info, name, name_len + 1)) {
+	if (zend_hash_find(&ce->properties_info, name, name_len+1, (void **) &property_info) == SUCCESS) {
+		if (property_info->flags & ZEND_ACC_SHADOW) {
+			RETURN_FALSE;
+		}
 		RETURN_TRUE;
 	} else {
-		if (intern->obj && Z_OBJ_HANDLER_P(intern->obj, has_property))
-		{
+		if (intern->obj && Z_OBJ_HANDLER_P(intern->obj, has_property)) {
 			MAKE_STD_ZVAL(property);
 			ZVAL_STRINGL(property, name, name_len, 1);
 			if (Z_OBJ_HANDLER_P(intern->obj, has_property)(intern->obj, property, 2 TSRMLS_CC)) {

Modified: php/php-src/branches/PHP_5_2/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt
===================================================================
--- php/php-src/branches/PHP_5_2/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt	2009-11-01 13:18:00 UTC (rev 290126)
+++ php/php-src/branches/PHP_5_2/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt	2009-11-01 15:12:34 UTC (rev 290127)
@@ -69,7 +69,7 @@
   --> Check for doesntExist: bool(false)
 Reflecting on class subprivf:
   --> Check for s: bool(true)
-  --> Check for a: bool(true)
+  --> Check for a: bool(false)
   --> Check for A: bool(false)
   --> Check for doesntExist: bool(false)


Added: php/php-src/branches/PHP_5_2/ext/reflection/tests/bug49719.phpt
===================================================================
--- php/php-src/branches/PHP_5_2/ext/reflection/tests/bug49719.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_2/ext/reflection/tests/bug49719.phpt	2009-11-01 15:12:34 UTC (rev 290127)
@@ -0,0 +1,30 @@
+--TEST--
+Bug #49719 (ReflectionClass::hasProperty returns true for a private property in base class)
+--FILE--
+<?php
+
+class A {
+	private $a;
+}
+class B extends A {
+	private $b;
+}
+
+try {
+	$b = new B;
+	$ref = new ReflectionClass($b);
+
+	var_dump(property_exists('b', 'a'));
+	var_dump(property_exists($b, 'a'));
+	var_dump($ref->hasProperty('a'));
+	var_dump($ref->getProperty('a'));
+} catch (Exception $e) {
+	var_dump($e->getMessage());
+}
+
+?>
+--EXPECTF--
+bool(false)
+bool(false)
+bool(false)
+%string|unicode%(25) "Property a does not exist"


Property changes on: php/php-src/branches/PHP_5_2/ext/reflection/tests/bug49719.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS	2009-11-01 13:18:00 UTC (rev 290126)
+++ php/php-src/branches/PHP_5_3/NEWS	2009-11-01 15:12:34 UTC (rev 290127)
@@ -16,6 +16,8 @@
   (Pierre)

 - Fixed bug #50023 (pdo_mysql doesn't use PHP_MYSQL_UNIX_SOCK_ADDR). (Ilia)
+- Fixed bug #49719 (ReflectionClass::hasProperty returns true for a private
+  property in base class). (Felipe)
 - Fixed bug #49142 (crash when exception thrown from __tostring()).
   (David Soria Parra)
 - Fixed bug #49990 (SNMP3 warning message about security level printed twice).

Modified: php/php-src/branches/PHP_5_3/ext/reflection/php_reflection.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/reflection/php_reflection.c	2009-11-01 13:18:00 UTC (rev 290126)
+++ php/php-src/branches/PHP_5_3/ext/reflection/php_reflection.c	2009-11-01 15:12:34 UTC (rev 290127)
@@ -3512,6 +3512,7 @@
 ZEND_METHOD(reflection_class, hasProperty)
 {
 	reflection_object *intern;
+	zend_property_info *property_info;
 	zend_class_entry *ce;
 	char *name;
 	int name_len;
@@ -3523,11 +3524,13 @@
 	}

 	GET_REFLECTION_OBJECT_PTR(ce);
-	if (zend_hash_exists(&ce->properties_info, name, name_len + 1)) {
+	if (zend_hash_find(&ce->properties_info, name, name_len+1, (void **) &property_info) == SUCCESS) {
+		if (property_info->flags & ZEND_ACC_SHADOW) {
+			RETURN_FALSE;
+		}
 		RETURN_TRUE;
 	} else {
-		if (intern->obj && Z_OBJ_HANDLER_P(intern->obj, has_property))
-		{
+		if (intern->obj && Z_OBJ_HANDLER_P(intern->obj, has_property)) {
 			MAKE_STD_ZVAL(property);
 			ZVAL_STRINGL(property, name, name_len, 1);
 			if (Z_OBJ_HANDLER_P(intern->obj, has_property)(intern->obj, property, 0 TSRMLS_CC)) {

Modified: php/php-src/branches/PHP_5_3/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt	2009-11-01 13:18:00 UTC (rev 290126)
+++ php/php-src/branches/PHP_5_3/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt	2009-11-01 15:12:34 UTC (rev 290127)
@@ -69,7 +69,7 @@
   --> Check for doesntExist: bool(false)
 Reflecting on class subprivf:
   --> Check for s: bool(true)
-  --> Check for a: bool(true)
+  --> Check for a: bool(false)
   --> Check for A: bool(false)
   --> Check for doesntExist: bool(false)


Added: php/php-src/branches/PHP_5_3/ext/reflection/tests/bug49719.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/reflection/tests/bug49719.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/reflection/tests/bug49719.phpt	2009-11-01 15:12:34 UTC (rev 290127)
@@ -0,0 +1,44 @@
+--TEST--
+Bug #49719 (ReflectionClass::hasProperty returns true for a private property in base class)
+--FILE--
+<?php
+
+class A {
+	private $a;
+}
+class B extends A {
+	private $b;
+}
+
+try {
+	$b = new B;
+	$ref = new ReflectionClass($b);
+
+	var_dump(property_exists('b', 'a'));
+	var_dump(property_exists($b, 'a'));
+	var_dump($ref->hasProperty('a'));
+	var_dump($ref->getProperty('a'));
+} catch (Exception $e) {
+	var_dump($e->getMessage());
+}
+
+class A2 {
+	private $a = 1;
+}
+
+class B2 extends A2 {
+	private $a = 2;
+}
+
+$b2 = new ReflectionClass('B2');
+$prop = $b2->getProperty('a');
+$prop->setAccessible(true);
+var_dump($prop->getValue(new b2));
+
+?>
+--EXPECTF--
+bool(false)
+bool(false)
+bool(false)
+%string|unicode%(25) "Property a does not exist"
+int(2)


Property changes on: php/php-src/branches/PHP_5_3/ext/reflection/tests/bug49719.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/trunk/ext/reflection/php_reflection.c
===================================================================
--- php/php-src/trunk/ext/reflection/php_reflection.c	2009-11-01 13:18:00 UTC (rev 290126)
+++ php/php-src/trunk/ext/reflection/php_reflection.c	2009-11-01 15:12:34 UTC (rev 290127)
@@ -3673,6 +3673,7 @@
 ZEND_METHOD(reflection_class, hasProperty)
 {
 	reflection_object *intern;
+	zend_property_info *property_info;
 	zend_class_entry *ce;
 	zstr name;
 	int name_len;
@@ -3685,7 +3686,10 @@
 	}

 	GET_REFLECTION_OBJECT_PTR(ce);
-	if (zend_u_hash_exists(&ce->properties_info, name_type, name, name_len + 1)) {
+	if (zend_u_hash_find(&ce->properties_info, name_type, name, name_len+1, (void **) &property_info) == SUCCESS) {
+		if (property_info->flags & ZEND_ACC_SHADOW) {
+			RETURN_FALSE;
+		}
 		RETURN_TRUE;
 	} else {
 		if (intern->obj && Z_OBJ_HANDLER_P(intern->obj, has_property))

Modified: php/php-src/trunk/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt
===================================================================
--- php/php-src/trunk/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt	2009-11-01 13:18:00 UTC (rev 290126)
+++ php/php-src/trunk/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt	2009-11-01 15:12:34 UTC (rev 290127)
@@ -69,7 +69,7 @@
   --> Check for doesntExist: bool(false)
 Reflecting on class subprivf:
   --> Check for s: bool(true)
-  --> Check for a: bool(true)
+  --> Check for a: bool(false)
   --> Check for A: bool(false)
   --> Check for doesntExist: bool(false)


Added: php/php-src/trunk/ext/reflection/tests/bug49719.phpt
===================================================================
--- php/php-src/trunk/ext/reflection/tests/bug49719.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/reflection/tests/bug49719.phpt	2009-11-01 15:12:34 UTC (rev 290127)
@@ -0,0 +1,44 @@
+--TEST--
+Bug #49719 (ReflectionClass::hasProperty returns true for a private property in base class)
+--FILE--
+<?php
+
+class A {
+	private $a;
+}
+class B extends A {
+	private $b;
+}
+
+try {
+	$b = new B;
+	$ref = new ReflectionClass($b);
+
+	var_dump(property_exists('b', 'a'));
+	var_dump(property_exists($b, 'a'));
+	var_dump($ref->hasProperty('a'));
+	var_dump($ref->getProperty('a'));
+} catch (Exception $e) {
+	var_dump($e->getMessage());
+}
+
+class A2 {
+	private $a = 1;
+}
+
+class B2 extends A2 {
+	private $a = 2;
+}
+
+$b2 = new ReflectionClass('B2');
+$prop = $b2->getProperty('a');
+$prop->setAccessible(true);
+var_dump($prop->getValue(new b2));
+
+?>
+--EXPECTF--
+bool(false)
+bool(false)
+bool(false)
+%string|unicode%(25) "Property a does not exist"
+int(2)


Property changes on: php/php-src/trunk/ext/reflection/tests/bug49719.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to