andrei Tue Sep 10 14:34:17 2002 EDT Modified files: /php4/ext/standard array.c php_array.h Log: @- Fixed array_merge_recursive() to avoid problems with merging cyclical @ arrays (bug #16064). (Andrei) Index: php4/ext/standard/array.c diff -u php4/ext/standard/array.c:1.185 php4/ext/standard/array.c:1.186 --- php4/ext/standard/array.c:1.185 Mon Sep 9 16:05:20 2002 +++ php4/ext/standard/array.c Tue Sep 10 14:34:16 2002 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: array.c,v 1.185 2002/09/09 20:05:20 andrei Exp $ */ +/* $Id: array.c,v 1.186 2002/09/10 18:34:16 andrei Exp $ */ #include "php.h" #include "php_ini.h" @@ -1966,7 +1966,7 @@ /* }}} */ -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 @@ 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 @@ zend_hash_move_forward_ex(src, &pos); } + + return 1; } static void php_array_merge_wrapper(INTERNAL_FUNCTION_PARAMETERS, int recursive) Index: php4/ext/standard/php_array.h diff -u php4/ext/standard/php_array.h:1.35 php4/ext/standard/php_array.h:1.36 --- php4/ext/standard/php_array.h:1.35 Mon May 13 13:28:38 2002 +++ php4/ext/standard/php_array.h Tue Sep 10 14:34:16 2002 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_array.h,v 1.35 2002/05/13 17:28:38 andrei Exp $ */ +/* $Id: php_array.h,v 1.36 2002/09/10 18:34:16 andrei Exp $ */ #ifndef PHP_ARRAY_H #define PHP_ARRAY_H @@ -83,7 +83,7 @@ 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 {
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php