diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2020-08-24 15:02:15 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2020-08-24 15:03:26 +0200 |
commit | 5643f34a1ed71ae33d313e31ebb8c814cc8e3c0a (patch) | |
tree | 433cd52ec49de2fa2d70bc2abc7ecfb7c9f5f11f /Zend/zend_vm_execute.h | |
parent | bfeb2f6abc35309f25074410ee7eb61f59c22274 (diff) | |
parent | 6b6c2c003c69729832a7804c76bff6e230b73c91 (diff) | |
download | php-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.h | 16 |
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++; |