diff options
author | Mitch Hagstrand <mhagstrand@gmail.com> | 2017-01-31 09:25:05 -0800 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2017-02-02 18:33:10 +0100 |
commit | dd9cf23457e21d2bda29dc92d437b9dbd14027b2 (patch) | |
tree | 624594a39e2c6bdeab3c40b3ae619b1ed7a5522a /Zend/zend_builtin_functions.c | |
parent | acda2563cea2acacdb126a6c14a144a9bf52e3a3 (diff) | |
download | php-git-dd9cf23457e21d2bda29dc92d437b9dbd14027b2.tar.gz |
BUG #73998: Numeric properties are not accessible from get_object_vars
Diffstat (limited to 'Zend/zend_builtin_functions.c')
-rw-r--r-- | Zend/zend_builtin_functions.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index aa705d3235..3b04ead955 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1146,6 +1146,8 @@ ZEND_FUNCTION(get_object_vars) HashTable *properties; zend_string *key; zend_object *zobj; + zend_ulong index; + zend_bool fast_copy = 0; ZEND_PARSE_PARAMETERS_START(1, 1) Z_PARAM_OBJECT(obj) @@ -1164,7 +1166,17 @@ ZEND_FUNCTION(get_object_vars) zobj = Z_OBJ_P(obj); if (!zobj->ce->default_properties_count && properties == zobj->properties && !ZEND_HASH_GET_APPLY_COUNT(properties)) { - /* fast copy */ + fast_copy = 1; + /* Check if the object has a numeric property, See Bug 73998 */ + ZEND_HASH_FOREACH_STR_KEY(properties, key) { + if (key && ZEND_HANDLE_NUMERIC(key, index)) { + fast_copy = 0; + break; + } + } ZEND_HASH_FOREACH_END(); + } + + if (fast_copy) { if (EXPECTED(zobj->handlers == &std_object_handlers)) { if (EXPECTED(!(GC_FLAGS(properties) & IS_ARRAY_IMMUTABLE))) { GC_REFCOUNT(properties)++; @@ -1190,7 +1202,7 @@ ZEND_FUNCTION(get_object_vars) zend_unmangle_property_name_ex(key, &class_name, &prop_name, &prop_len); zend_hash_str_add_new(Z_ARRVAL_P(return_value), prop_name, prop_len, value); } else { - zend_hash_add_new(Z_ARRVAL_P(return_value), key, value); + zend_symbtable_add_new(Z_ARRVAL_P(return_value), key, value); } } } |