From 38fb1f83839ceb04de92a3b6eb75cdf37d7686bb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 16 Jul 2020 20:56:44 +0200 Subject: [PATCH] Check for missing arginfo arguments Internal functions error when too many arguments are passed. Make this part of the verification we do in debug builds. This will help avoid cases where an argument is missing in the stubs, as recently encountered in 6d96f0f. --- Zend/zend_execute.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index b7dce3614c..f6ce352ad8 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -130,7 +130,7 @@ static ZEND_FUNCTION(pass) ZEND_API const zend_internal_function zend_pass_function = { ZEND_INTERNAL_FUNCTION, /* type */ {0, 0, 0}, /* arg_flags */ - 0, /* fn_flags */ + ZEND_ACC_VARIADIC, /* fn_flags */ NULL, /* name */ NULL, /* scope */ NULL, /* prototype */ @@ -1122,6 +1122,14 @@ static zend_never_inline ZEND_ATTRIBUTE_UNUSED int zend_verify_internal_arg_type static zend_always_inline zend_bool zend_internal_call_should_throw(zend_function *fbc, zend_execute_data *call) { if (fbc->common.required_num_args > ZEND_CALL_NUM_ARGS(call)) { + /* Required argument not passed. */ + return 1; + } + + if (fbc->common.num_args < ZEND_CALL_NUM_ARGS(call) + && !(fbc->common.fn_flags & ZEND_ACC_VARIADIC)) { + /* Too many arguments passed. For internal functions (unlike userland functions), + * this should always throw. */ return 1; } -- 2.50.1