From 43f1c94ddace679cac008b674ef983199a951542 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 9 Oct 2014 12:51:05 +0200 Subject: [PATCH] Review a few more SEPARATE_ZVAL_IF_NOT_REF usages --- Zend/zend_execute_API.c | 4 ++-- Zend/zend_types.h | 1 + ext/filter/filter.c | 3 ++- .../tests/filter_var_array_with_ref.phpt | 23 +++++++++++++++++++ ext/mbstring/php_mbregex.c | 3 +-- ext/session/session.c | 5 +--- ext/spl/spl_array.c | 2 +- 7 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 ext/filter/tests/filter_var_array_with_ref.phpt diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index f6bd9d1ca7..cd2cc98b42 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -521,7 +521,7 @@ ZEND_API int zval_update_constant_ex(zval *p, zend_bool inline_change, zend_clas } else if (Z_TYPE_P(p) == IS_CONSTANT) { int refcount; - SEPARATE_ZVAL_IF_NOT_REF(p); + SEPARATE_ZVAL_NOREF(p); MARK_CONSTANT_VISITED(p); refcount = Z_REFCOUNTED_P(p) ? Z_REFCOUNT_P(p) : 1; const_value = zend_get_constant_ex(Z_STR_P(p), scope, Z_CONST_FLAGS_P(p) TSRMLS_CC); @@ -599,7 +599,7 @@ ZEND_API int zval_update_constant_ex(zval *p, zend_bool inline_change, zend_clas if (Z_REFCOUNTED_P(p)) Z_SET_REFCOUNT_P(p, refcount); } else if (Z_TYPE_P(p) == IS_CONSTANT_AST) { zval tmp; - SEPARATE_ZVAL_IF_NOT_REF(p); + SEPARATE_ZVAL_NOREF(p); zend_ast_evaluate(&tmp, Z_ASTVAL_P(p), scope TSRMLS_CC); if (inline_change) { diff --git a/Zend/zend_types.h b/Zend/zend_types.h index b7e806804f..811133a275 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -783,6 +783,7 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) { #define SEPARATE_ZVAL_NOREF(zv) do { \ zval *_zv = (zv); \ + ZEND_ASSERT(Z_TYPE_P(_zv) != IS_REFERENCE); \ if (Z_COPYABLE_P(_zv) || \ Z_IMMUTABLE_P(_zv)) { \ if (Z_REFCOUNT_P(_zv) > 1) { \ diff --git a/ext/filter/filter.c b/ext/filter/filter.c index 7ef65bc196..ec3c007afd 100644 --- a/ext/filter/filter.c +++ b/ext/filter/filter.c @@ -491,7 +491,8 @@ static void php_zval_filter_recursive(zval *value, zend_long filter, zend_long f } ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(value), element) { - SEPARATE_ZVAL_IF_NOT_REF(element); + ZVAL_DEREF(element); + SEPARATE_ZVAL_NOREF(element); if (Z_TYPE_P(element) == IS_ARRAY) { Z_ARRVAL_P(element)->u.v.nApplyCount++; php_zval_filter_recursive(element, filter, flags, options, charset, copy TSRMLS_CC); diff --git a/ext/filter/tests/filter_var_array_with_ref.phpt b/ext/filter/tests/filter_var_array_with_ref.phpt new file mode 100644 index 0000000000..cd202edf4d --- /dev/null +++ b/ext/filter/tests/filter_var_array_with_ref.phpt @@ -0,0 +1,23 @@ +--TEST-- +filter_var_array() on array with reference +--FILE-- + +--EXPECTF-- +array(1) { + [0]=> + &array(1) { + [0]=> + bool(false) + } +} +array(1) { + [0]=> + bool(false) +} diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index de0bc768ad..8be88c3fee 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -1343,8 +1343,7 @@ PHP_FUNCTION(mb_ereg_search_init) zval_ptr_dtor(&MBREX(search_str)); } - ZVAL_COPY(&MBREX(search_str), arg_str); - SEPARATE_ZVAL_IF_NOT_REF(&MBREX(search_str)); + ZVAL_DUP(&MBREX(search_str), arg_str); MBREX(search_pos) = 0; diff --git a/ext/session/session.c b/ext/session/session.c index 63bb00e06a..dae965b048 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -2105,10 +2105,7 @@ static PHP_FUNCTION(session_unset) } IF_SESSION_VARS() { - HashTable *ht_sess_var; - - SEPARATE_ZVAL_IF_NOT_REF(&PS(http_session_vars)); - ht_sess_var = Z_ARRVAL_P(Z_REFVAL(PS(http_session_vars))); + HashTable *ht_sess_var = Z_ARRVAL_P(Z_REFVAL(PS(http_session_vars))); /* Clean $_SESSION. */ zend_hash_clean(ht_sess_var); diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 211180a08d..8aab4c49bf 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -1144,7 +1144,7 @@ static void spl_array_it_rewind(zend_object_iterator *iter TSRMLS_DC) /* {{{ */ static void spl_array_set_array(zval *object, spl_array_object *intern, zval *array, zend_long ar_flags, int just_array TSRMLS_DC) { if (Z_TYPE_P(array) == IS_ARRAY) { - SEPARATE_ZVAL_IF_NOT_REF(array); + SEPARATE_ARRAY(array); } if (Z_TYPE_P(array) == IS_OBJECT && (Z_OBJ_HT_P(array) == &spl_handler_ArrayObject || Z_OBJ_HT_P(array) == &spl_handler_ArrayIterator)) { -- 2.40.0