summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_execute.h
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2020-08-24 15:02:15 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2020-08-24 15:03:26 +0200
commit5643f34a1ed71ae33d313e31ebb8c814cc8e3c0a (patch)
tree433cd52ec49de2fa2d70bc2abc7ecfb7c9f5f11f /Zend/zend_vm_execute.h
parentbfeb2f6abc35309f25074410ee7eb61f59c22274 (diff)
parent6b6c2c003c69729832a7804c76bff6e230b73c91 (diff)
downloadphp-git-5643f34a1ed71ae33d313e31ebb8c814cc8e3c0a.tar.gz
Merge branch 'PHP-7.4' into master
* PHP-7.4: Fix #79979: passing value to by-ref param via CUFA crashes
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r--Zend/zend_vm_execute.h16
1 files changed, 14 insertions, 2 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 7a50d99d29..d87edfc570 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -2098,6 +2098,7 @@ send_array:
arg_num = 1;
param = ZEND_CALL_ARG(EX(call), 1);
ZEND_HASH_FOREACH_VAL(ht, arg) {
+ zend_bool must_wrap = 0;
if (skip > 0) {
skip--;
continue;
@@ -2109,6 +2110,7 @@ send_array:
/* By-value send is not allowed -- emit a warning,
* but still perform the call. */
zend_param_must_be_ref(EX(call)->func, arg_num);
+ must_wrap = 1;
}
}
} else {
@@ -2118,7 +2120,11 @@ send_array:
arg = Z_REFVAL_P(arg);
}
}
- ZVAL_COPY(param, arg);
+ if (EXPECTED(!must_wrap)) {
+ ZVAL_COPY(param, arg);
+ } else {
+ ZVAL_NEW_REF(param, arg);
+ }
ZEND_CALL_NUM_ARGS(EX(call))++;
arg_num++;
param++;
@@ -2148,12 +2154,14 @@ send_array:
HANDLE_EXCEPTION();
}
+ zend_bool must_wrap = 0;
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
if (UNEXPECTED(!Z_ISREF_P(arg))) {
if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
/* By-value send is not allowed -- emit a warning,
* but still perform the call. */
zend_param_must_be_ref(EX(call)->func, arg_num);
+ must_wrap = 1;
}
}
} else {
@@ -2164,7 +2172,11 @@ send_array:
}
}
- ZVAL_COPY(param, arg);
+ if (EXPECTED(!must_wrap)) {
+ ZVAL_COPY(param, arg);
+ } else {
+ ZVAL_NEW_REF(param, arg);
+ }
if (!name) {
ZEND_CALL_NUM_ARGS(EX(call))++;
arg_num++;