summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorAntony Dovgal <tony2001@php.net>2005-04-12 14:00:54 +0000
committerAntony Dovgal <tony2001@php.net>2005-04-12 14:00:54 +0000
commita13b29add71436af5d8a611c3fe5946fce0f6ddb (patch)
tree2d324b314da7ae2afee518a42fe15b0aa09e388c /ext
parent5ddf66e004bdb40bc31a0bf9cdb9b1ede5b0d0b2 (diff)
downloadphp-git-a13b29add71436af5d8a611c3fe5946fce0f6ddb.tar.gz
fix #30833 (array_count_values modifying input array)
Diffstat (limited to 'ext')
-rw-r--r--ext/standard/array.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 41b4b668c0..9981ea5db8 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -2466,7 +2466,6 @@ PHP_FUNCTION(array_count_values)
zend_hash_internal_pointer_reset_ex(myht, &pos);
while (zend_hash_get_current_data_ex(myht, (void **)&entry, &pos) == SUCCESS) {
if (Z_TYPE_PP(entry) == IS_LONG) {
-int_key:
if (zend_hash_index_find(Z_ARRVAL_P(return_value),
Z_LVAL_PP(entry),
(void**)&tmp) == FAILURE) {
@@ -2481,9 +2480,28 @@ int_key:
} else if (Z_TYPE_PP(entry) == IS_STRING) {
/* make sure our array does not end up with numeric string keys */
if (is_numeric_string(Z_STRVAL_PP(entry), Z_STRLEN_PP(entry), NULL, NULL, 0) == IS_LONG) {
- SEPARATE_ZVAL(entry);
- convert_to_long_ex(entry);
- goto int_key;
+ zval tmp_entry;
+
+ tmp_entry = **entry;
+ zval_copy_ctor(&tmp_entry);
+
+ convert_to_long(&tmp_entry);
+
+ if (zend_hash_index_find(Z_ARRVAL_P(return_value),
+ Z_LVAL(tmp_entry),
+ (void**)&tmp) == FAILURE) {
+ zval *data;
+ MAKE_STD_ZVAL(data);
+ Z_TYPE_P(data) = IS_LONG;
+ Z_LVAL_P(data) = 1;
+ zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL(tmp_entry), &data, sizeof(data), NULL);
+ } else {
+ Z_LVAL_PP(tmp)++;
+ }
+
+ zval_dtor(&tmp_entry);
+ zend_hash_move_forward_ex(myht, &pos);
+ continue;
}
if (zend_hash_find(Z_ARRVAL_P(return_value), Z_STRVAL_PP(entry), Z_STRLEN_PP(entry)+1, (void**)&tmp) == FAILURE) {