cvs: php4 /ext/standard array.c php_array.h
| From: | Andrei Zmievski | Date: | Tue, 10 Sep 2002 18:34:17 +0000 |
| Subject: | cvs: php4 /ext/standard array.c php_array.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-14000@lists.php.net to get a copy of this message | ||
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 {