summaryrefslogtreecommitdiff
path: root/ext/standard/exec.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/exec.c')
-rw-r--r--ext/standard/exec.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/ext/standard/exec.c b/ext/standard/exec.c
index 08f51cf3b5..1e70021674 100644
--- a/ext/standard/exec.c
+++ b/ext/standard/exec.c
@@ -217,9 +217,9 @@ static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */
Z_PARAM_STRING(cmd, cmd_len)
Z_PARAM_OPTIONAL
if (!mode) {
- Z_PARAM_ZVAL_DEREF_EX(ret_array, 0, 1)
+ Z_PARAM_ZVAL_DEREF(ret_array)
}
- Z_PARAM_ZVAL_DEREF_EX(ret_code, 0, 1)
+ Z_PARAM_ZVAL_DEREF(ret_code)
ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE);
if (!cmd_len) {
@@ -235,13 +235,16 @@ static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */
ret = php_exec(mode, cmd, NULL, return_value);
} else {
if (Z_TYPE_P(ret_array) != IS_ARRAY) {
- zval_dtor(ret_array);
+ zval_ptr_dtor(ret_array);
array_init(ret_array);
+ } else if (Z_REFCOUNT_P(ret_array) > 1) {
+ zval_ptr_dtor(ret_array);
+ ZVAL_ARR(ret_array, zend_array_dup(Z_ARR_P(ret_array)));
}
ret = php_exec(2, cmd, ret_array, return_value);
}
if (ret_code) {
- zval_dtor(ret_code);
+ zval_ptr_dtor(ret_code);
ZVAL_LONG(ret_code, ret);
}
}