summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-05-27 16:09:58 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-05-27 16:12:42 +0200
commit62f339c8d5071c46005a3fa1ee44563347bdc5c5 (patch)
tree8efb6fedbd2070134455c90acec2f068bb332717
parent6f9dfd947302f9a0d2fa6a78bf385b1ca7dafdf3 (diff)
downloadphp-git-62f339c8d5071c46005a3fa1ee44563347bdc5c5.tar.gz
Func info: Fix calls to zero-arg varargs
The num_args does not include variadics, so a "zero-arg" function may accept additional arguments through that. No functions seem to be affected right now, but they will be after #4175.
-rw-r--r--ext/opcache/Optimizer/zend_func_info.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/ext/opcache/Optimizer/zend_func_info.c b/ext/opcache/Optimizer/zend_func_info.c
index 894c42dcee..0908d1da1f 100644
--- a/ext/opcache/Optimizer/zend_func_info.c
+++ b/ext/opcache/Optimizer/zend_func_info.c
@@ -1688,8 +1688,9 @@ int zend_func_info_rid = -1;
uint32_t zend_get_func_info(const zend_call_info *call_info, const zend_ssa *ssa)
{
uint32_t ret = 0;
+ const zend_function *callee_func = call_info->callee_func;
- if (call_info->callee_func->type == ZEND_INTERNAL_FUNCTION) {
+ if (callee_func->type == ZEND_INTERNAL_FUNCTION) {
zval *zv;
func_info_t *info;
@@ -1700,9 +1701,10 @@ uint32_t zend_get_func_info(const zend_call_info *call_info, const zend_ssa *ssa
ret = MAY_BE_NULL;
} else if (info->info_func) {
ret = info->info_func(call_info, ssa);
- } else if (/*call_info->callee_func->common.arg_info && */
- call_info->callee_func->common.num_args == 0 &&
- call_info->callee_func->common.required_num_args == 0) {
+ } else if (/*callee_func->common.arg_info && */
+ callee_func->common.num_args == 0 &&
+ callee_func->common.required_num_args == 0 &&
+ !(callee_func->common.fn_flags & ZEND_ACC_VARIADIC)) {
if (call_info->num_args == 0) {
ret = info->info;
} else {
@@ -1718,19 +1720,19 @@ uint32_t zend_get_func_info(const zend_call_info *call_info, const zend_ssa *ssa
}
} else {
// FIXME: the order of functions matters!!!
- zend_func_info *info = ZEND_FUNC_INFO((zend_op_array*)call_info->callee_func);
+ zend_func_info *info = ZEND_FUNC_INFO((zend_op_array*)callee_func);
if (info) {
ret = info->return_info.type;
}
}
if (!ret) {
ret = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
- if (call_info->callee_func->type == ZEND_INTERNAL_FUNCTION) {
+ if (callee_func->type == ZEND_INTERNAL_FUNCTION) {
ret |= FUNC_MAY_WARN;
}
- if (call_info->callee_func->common.fn_flags & ZEND_ACC_GENERATOR) {
+ if (callee_func->common.fn_flags & ZEND_ACC_GENERATOR) {
ret = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_OBJECT;
- } else if (call_info->callee_func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ } else if (callee_func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
ret |= MAY_BE_REF;
} else {
ret |= MAY_BE_RC1 | MAY_BE_RCN;