From: Felipe Pena Date: Sun, 1 Nov 2009 15:12:34 +0000 (+0000) Subject: - Fixed bug #49719 (ReflectionClass::hasProperty returns true for a private property... X-Git-Tag: php-5.2.12RC1~39 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=caa28c2a22ea36205af97fd13e3599caf77f0f76;p=php - Fixed bug #49719 (ReflectionClass::hasProperty returns true for a private property in base class) --- diff --git a/NEWS b/NEWS index 9003ed5c00..2460f80535 100644 --- a/NEWS +++ b/NEWS @@ -37,6 +37,8 @@ PHP NEWS - 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) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index ba165dbd1e..fee247ed8f 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3104,6 +3104,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; @@ -3115,11 +3116,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, 2 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..36e835d3d3 --- /dev/null +++ b/ext/reflection/tests/bug49719.phpt @@ -0,0 +1,30 @@ +--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()); +} + +?> +--EXPECTF-- +bool(false) +bool(false) +bool(false) +%string|unicode%(25) "Property a does not exist"