Skip to content

Commit 9395e01

Browse files
committed
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.
1 parent 2c2bb50 commit 9395e01

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

Zend/zend_API.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2371,10 +2371,16 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
23712371
break;
23722372
}
23732373

2374+
/* Get parameter count including variadic parameter. */
2375+
uint32_t num_args = reg_function->common.num_args;
2376+
if (reg_function->common.fn_flags & ZEND_ACC_VARIADIC) {
2377+
num_args++;
2378+
}
2379+
23742380
/* If types of arguments have to be checked */
2375-
if (reg_function->common.arg_info && reg_function->common.num_args) {
2381+
if (reg_function->common.arg_info && num_args) {
23762382
uint32_t i;
2377-
for (i = 0; i < reg_function->common.num_args; i++) {
2383+
for (i = 0; i < num_args; i++) {
23782384
zend_internal_arg_info *arg_info = &reg_function->internal_function.arg_info[i];
23792385
ZEND_ASSERT(arg_info->name && "Parameter must have a name");
23802386
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
23962402
(reg_function->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS))) {
23972403
/* convert "const char*" class type names into "zend_string*" */
23982404
uint32_t i;
2399-
uint32_t num_args = reg_function->common.num_args + 1;
24002405
zend_arg_info *arg_info = reg_function->common.arg_info - 1;
24012406
zend_arg_info *new_arg_info;
24022407

2403-
if (reg_function->common.fn_flags & ZEND_ACC_VARIADIC) {
2404-
num_args++;
2405-
}
2408+
/* Treat return type as an extra argument */
2409+
num_args++;
24062410
new_arg_info = malloc(sizeof(zend_arg_info) * num_args);
24072411
memcpy(new_arg_info, arg_info, sizeof(zend_arg_info) * num_args);
24082412
reg_function->common.arg_info = new_arg_info + 1;

0 commit comments

Comments
 (0)