]> granicus.if.org Git - php/commitdiff
@- Fixed array_merge_recursive() to avoid problems with merging cyclical
authorAndrei Zmievski <andrei@php.net>
Tue, 10 Sep 2002 18:34:16 +0000 (18:34 +0000)
committerAndrei Zmievski <andrei@php.net>
Tue, 10 Sep 2002 18:34:16 +0000 (18:34 +0000)
@  arrays (bug #16064). (Andrei)

ext/standard/array.c
ext/standard/php_array.h

index 2af0847e1164f18201a28d8943ca8c7b93ebe412..b132b5d6bddc67f76a0f8e489017d1b7e1b07367 100644 (file)
@@ -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)
index 96c05a7a3700be5b3f97340a16ba80122ff3e32e..0ef979c550533b5f8affe9797c5c510db91a23d8 100644 (file)
@@ -83,7 +83,7 @@ PHP_FUNCTION(array_key_exists);
 PHP_FUNCTION(array_chunk);
 
 HashTable* php_splice(HashTable *, int, int, zval ***, int, HashTable **);
-PHPAPI void php_array_merge(HashTable *dest, HashTable *src, int recursive);
+PHPAPI int php_array_merge(HashTable *dest, HashTable *src, int recursive);
 int multisort_compare(const void *a, const void *b TSRMLS_DC);
 
 typedef struct {