diff options
author | Ilia Alshanetsky <iliaa@php.net> | 2006-07-25 14:06:52 +0000 |
---|---|---|
committer | Ilia Alshanetsky <iliaa@php.net> | 2006-07-25 14:06:52 +0000 |
commit | e11e2a137ce5bd84aa710e152a2ecf10d67abd40 (patch) | |
tree | 447e301ccedd7a899875b34bff07dc4a489bef81 | |
parent | 356facf4afc9c3cea3d6648923f69daba9e1ec82 (diff) | |
download | php-git-e11e2a137ce5bd84aa710e152a2ecf10d67abd40.tar.gz |
Fixed bug #38132 (ReflectionClass::getStaticProperties() retains \0 in key
names).
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | ext/reflection/php_reflection.c | 31 | ||||
-rwxr-xr-x | ext/reflection/tests/bug38132.phpt | 33 |
3 files changed, 63 insertions, 3 deletions
@@ -11,6 +11,8 @@ PHP NEWS - Fixed bug #38194 (ReflectionClass::isSubclassOf() returns TRUE for the class itself). (Ilia) +- Fixed bug #38132 (ReflectionClass::getStaticProperties() retains \0 in key + names). (Ilia) 24 Jul 2006, PHP 5.2.0RC1 - Updated bundled MySQL client library to version 5.0.22 in the Windows diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 06c04ab596..c8a6b2ae5e 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -2623,17 +2623,42 @@ ZEND_METHOD(reflection_class, __construct) Returns an associative array containing all static property values of the class */ ZEND_METHOD(reflection_class, getStaticProperties) { - zval *tmp_copy; reflection_object *intern; zend_class_entry *ce; - + HashPosition pos; + zval **value; + METHOD_NOTSTATIC_NUMPARAMS(reflection_class_ptr, 0); GET_REFLECTION_OBJECT_PTR(ce); zend_update_class_constants(ce TSRMLS_CC); array_init(return_value); - zend_hash_copy(Z_ARRVAL_P(return_value), CE_STATIC_MEMBERS(ce), (copy_ctor_func_t) zval_add_ref, (void *) &tmp_copy, sizeof(zval *)); + + zend_hash_internal_pointer_reset_ex(CE_STATIC_MEMBERS(ce), &pos); + + while (zend_hash_get_current_data_ex(CE_STATIC_MEMBERS(ce), (void **) &value, &pos) == SUCCESS) { + uint key_len; + char *key; + ulong num_index; + + if (zend_hash_get_current_key_ex(CE_STATIC_MEMBERS(ce), &key, &key_len, &num_index, 0, &pos) != FAILURE && key) { + zval_add_ref(value); + + if (*key == '\0') { + *key++; + key_len--; + + } + if (*key == '*' && *(key+1) == '\0') { + *(key+1) = *key++; + key_len--; + } + + zend_hash_update(Z_ARRVAL_P(return_value), key, key_len, value, sizeof(zval *), NULL); + } + zend_hash_move_forward_ex(CE_STATIC_MEMBERS(ce), &pos); + } } /* }}} */ diff --git a/ext/reflection/tests/bug38132.phpt b/ext/reflection/tests/bug38132.phpt new file mode 100755 index 0000000000..eaaca850d8 --- /dev/null +++ b/ext/reflection/tests/bug38132.phpt @@ -0,0 +1,33 @@ +--TEST-- +Reflection Bug #38132 (ReflectionClass::getStaticProperties() retains \0 in key names) +--SKIPIF-- +<?php extension_loaded('reflection') or die('skip'); ?> +--FILE-- +<?php +class foo { + static protected $bar = 'baz'; + static public $a = 'a'; +} + +$class = new ReflectionClass('foo'); +$properties = $class->getStaticProperties(); +var_dump($properties, array_keys($properties)); +var_dump(isset($properties['*bar'])); // false +var_dump(isset($properties["\0*\0bar"])); // true + +?> +--EXPECT-- +array(2) { + ["*bar"]=> + string(3) "baz" + ["a"]=> + string(1) "a" +} +array(2) { + [0]=> + string(4) "*bar" + [1]=> + string(1) "a" +} +bool(true) +bool(false) |