From 9395e01e3d5b7e34e788c2f1c84252be9c80bf1f Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 24 Aug 2020 10:15:57 +0200 Subject: [PATCH] Check variadic parameter for type and duplicate name Set HAS_TYPE_HINTS flag if the variadic parameter is types as well, and make sure it has a distinct name. This was previously missed, because the variadic parameter is not part of num_args. --- Zend/zend_API.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 03b65779da..de6e6d2b3d 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2371,10 +2371,16 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio break; } + /* Get parameter count including variadic parameter. */ + uint32_t num_args = reg_function->common.num_args; + if (reg_function->common.fn_flags & ZEND_ACC_VARIADIC) { + num_args++; + } + /* If types of arguments have to be checked */ - if (reg_function->common.arg_info && reg_function->common.num_args) { + if (reg_function->common.arg_info && num_args) { uint32_t i; - for (i = 0; i < reg_function->common.num_args; i++) { + for (i = 0; i < num_args; i++) { zend_internal_arg_info *arg_info = ®_function->internal_function.arg_info[i]; ZEND_ASSERT(arg_info->name && "Parameter must have a name"); if (ZEND_TYPE_IS_SET(arg_info->type)) { @@ -2396,13 +2402,11 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio (reg_function->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS))) { /* convert "const char*" class type names into "zend_string*" */ uint32_t i; - uint32_t num_args = reg_function->common.num_args + 1; zend_arg_info *arg_info = reg_function->common.arg_info - 1; zend_arg_info *new_arg_info; - if (reg_function->common.fn_flags & ZEND_ACC_VARIADIC) { - num_args++; - } + /* Treat return type as an extra argument */ + num_args++; new_arg_info = malloc(sizeof(zend_arg_info) * num_args); memcpy(new_arg_info, arg_info, sizeof(zend_arg_info) * num_args); reg_function->common.arg_info = new_arg_info + 1; -- 2.50.1