From 57ae19a0b79f2f470b76963e43cd32366811bb7c Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 5 Mar 2014 16:57:48 +0800 Subject: [PATCH] Checkout refcounted before doing addref --- ext/standard/array.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index 0535e57849..459ea531f8 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2591,18 +2591,20 @@ PHP_FUNCTION(array_column) zkeyval = zend_hash_index_find(ht, Z_LVAL_P(zkey)); } - Z_ADDREF_P(zcolval); if (zkeyval && Z_TYPE_P(zkeyval) == IS_STRING) { -//??? + Z_ADDREF_P(zcolval); add_assoc_zval(return_value, Z_STRVAL_P(zkeyval), zcolval); } else if (zkeyval && Z_TYPE_P(zkeyval) == IS_LONG) { add_index_zval(return_value, Z_LVAL_P(zkeyval), zcolval); } else if (zkeyval && Z_TYPE_P(zkeyval) == IS_OBJECT) { + Z_ADDREF_P(zcolval); SEPARATE_ZVAL(zkeyval); convert_to_string(zkeyval); -//??? add_assoc_zval(return_value, Z_STRVAL_P(zkeyval), zcolval); } else { + if (Z_REFCOUNTED_P(zcolval)) { + Z_ADDREF_P(zcolval); + } add_next_index_zval(return_value, zcolval); } } @@ -2785,7 +2787,7 @@ PHP_FUNCTION(array_change_key_case) php_strtolower(new_key->val, new_key->len); } zend_hash_update(Z_ARRVAL_P(return_value), new_key, entry); - STR_FREE(new_key); + STR_RELEASE(new_key); break; } @@ -2990,7 +2992,9 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa } } if (ok) { - Z_ADDREF(p->val); + if (Z_REFCOUNTED(p->val)) { + Z_ADDREF(p->val); + } zend_hash_index_update(Z_ARRVAL_P(return_value), p->h, &p->val); } } else { @@ -3005,7 +3009,9 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa } } if (ok) { - Z_ADDREF(p->val); + if (Z_REFCOUNTED(p->val)) { + Z_ADDREF(p->val); + } zend_hash_update(Z_ARRVAL_P(return_value), p->key, &p->val); } } @@ -3409,7 +3415,9 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty } } if (ok) { - Z_ADDREF(p->val); + if (Z_REFCOUNTED(p->val)) { + Z_ADDREF(p->val); + } zend_hash_index_update(Z_ARRVAL_P(return_value), p->h, &p->val); } } else { @@ -3424,7 +3432,9 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty } } if (ok) { - Z_ADDREF(p->val); + if (Z_REFCOUNTED(p->val)) { + Z_ADDREF(p->val); + } zend_hash_update(Z_ARRVAL_P(return_value), p->key, &p->val); } } -- 2.40.0