From 8e91d46481cfd65a6d80eff7b5e7cd912fc94c6e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 1 Nov 2009 15:12:34 +0000 Subject: [PATCH] - Fixed bug #49719 (ReflectionClass::hasProperty returns true for a private property in base class) --- NEWS | 2 + ext/reflection/php_reflection.c | 9 ++-- .../ReflectionClass_hasProperty_001.phpt | 2 +- ext/reflection/tests/bug49719.phpt | 44 +++++++++++++++++++ 4 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 ext/reflection/tests/bug49719.phpt diff --git a/NEWS b/NEWS index dfca2c1b07..e663a5acd4 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,8 @@ PHP NEWS (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). diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index a1ee0d6eb1..9589307f04 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3512,6 +3512,7 @@ ZEND_METHOD(reflection_class, getMethods) 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 @@ ZEND_METHOD(reflection_class, hasProperty) } 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)) { diff --git a/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt b/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt index 94f739c33c..88c4cd509a 100644 --- a/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt +++ b/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt @@ -69,7 +69,7 @@ Reflecting on class privf: --> 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) diff --git a/ext/reflection/tests/bug49719.phpt b/ext/reflection/tests/bug49719.phpt new file mode 100644 index 0000000000..215140a45a --- /dev/null +++ b/ext/reflection/tests/bug49719.phpt @@ -0,0 +1,44 @@ +--TEST-- +Bug #49719 (ReflectionClass::hasProperty returns true for a private property in base class) +--FILE-- +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) -- 2.40.0