summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2016-06-09 15:07:44 +0300
committerDmitry Stogov <dmitry@zend.com>2016-06-09 15:07:44 +0300
commitbfcf32237e32b46cba7ce2f9bcd36482978f8dd8 (patch)
tree4cbb57020b4df8dbda9df77e9243a3d65d28dfc6 /ext/standard/array.c
parent65b6950a56cb19635cf533ff7f7efa2acc918d43 (diff)
downloadphp-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.c15
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();