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