summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r--ext/standard/array.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 2af0847e11..b132b5d6bd 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -1966,7 +1966,7 @@ PHP_FUNCTION(array_slice)
/* }}} */
-PHPAPI void php_array_merge(HashTable *dest, HashTable *src, int recursive)
+PHPAPI int php_array_merge(HashTable *dest, HashTable *src, int recursive)
{
zval **src_entry,
**dest_entry;
@@ -1982,10 +1982,16 @@ PHPAPI void php_array_merge(HashTable *dest, HashTable *src, int recursive)
if (recursive &&
zend_hash_find(dest, string_key, string_key_len,
(void **)&dest_entry) == SUCCESS) {
+ if (*src_entry == *dest_entry) {
+ zend_error(E_WARNING, "%s(): recursion detected",
+ get_active_function_name());
+ return 0;
+ }
convert_to_array_ex(dest_entry);
convert_to_array_ex(src_entry);
- php_array_merge(Z_ARRVAL_PP(dest_entry),
- Z_ARRVAL_PP(src_entry), recursive);
+ if (!php_array_merge(Z_ARRVAL_PP(dest_entry),
+ Z_ARRVAL_PP(src_entry), recursive))
+ return 0;
} else {
(*src_entry)->refcount++;
@@ -2002,6 +2008,8 @@ PHPAPI void php_array_merge(HashTable *dest, HashTable *src, int recursive)
zend_hash_move_forward_ex(src, &pos);
}
+
+ return 1;
}
static void php_array_merge_wrapper(INTERNAL_FUNCTION_PARAMETERS, int recursive)