diff options
author | Dmitry Stogov <dmitry@zend.com> | 2016-06-09 15:07:44 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2016-06-09 15:07:44 +0300 |
commit | bfcf32237e32b46cba7ce2f9bcd36482978f8dd8 (patch) | |
tree | 4cbb57020b4df8dbda9df77e9243a3d65d28dfc6 /ext/standard/array.c | |
parent | 65b6950a56cb19635cf533ff7f7efa2acc918d43 (diff) | |
download | php-git-bfcf32237e32b46cba7ce2f9bcd36482978f8dd8.tar.gz |
Fixed bug #72369 (array_merge() produces references in PHP7)
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r-- | ext/standard/array.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c index d07daf819a..6c58e3aa74 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -3095,15 +3095,20 @@ PHPAPI int php_array_merge(HashTable *dest, HashTable *src) /* {{{ */ zend_string *string_key; ZEND_HASH_FOREACH_STR_KEY_VAL(src, string_key, src_entry) { - if (string_key) { - if (Z_REFCOUNTED_P(src_entry)) { + if (Z_REFCOUNTED_P(src_entry)) { + if (UNEXPECTED(Z_ISREF_P(src_entry)) + && UNEXPECTED(Z_REFCOUNT_P(src_entry) == 1)) { + ZVAL_UNREF(src_entry); + if (Z_REFCOUNTED_P(src_entry)) { + Z_ADDREF_P(src_entry); + } + } else { Z_ADDREF_P(src_entry); } + } + if (string_key) { zend_hash_update(dest, string_key, src_entry); } else { - if (Z_REFCOUNTED_P(src_entry)) { - Z_ADDREF_P(src_entry); - } zend_hash_next_index_insert_new(dest, src_entry); } } ZEND_HASH_FOREACH_END(); |