]> granicus.if.org Git - php/commitdiff
Check for missing arginfo arguments
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 16 Jul 2020 18:56:44 +0000 (20:56 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 21 Jul 2020 12:17:29 +0000 (14:17 +0200)
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

index b7dce3614cb614a380e4ae59b72d7bd33fad7175..f6ce352ad81b29ccf8a858ea5c35cc0a652acdcb 100644 (file)
@@ -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;
        }