]> granicus.if.org Git - php/commitdiff
Don't allow passing unknown named params to class without ctor
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 21 Oct 2020 09:55:03 +0000 (11:55 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 23 Oct 2020 07:46:55 +0000 (09:46 +0200)
See also https://externals.io/message/112083.

Closes GH-6364.

Zend/tests/named_params/ctor_extra_named_args.phpt [new file with mode: 0644]
Zend/zend_execute.c

diff --git a/Zend/tests/named_params/ctor_extra_named_args.phpt b/Zend/tests/named_params/ctor_extra_named_args.phpt
new file mode 100644 (file)
index 0000000..ae569ea
--- /dev/null
@@ -0,0 +1,23 @@
+--TEST--
+Passing unknown named args to a non-existing ctor
+--FILE--
+<?php
+
+class Test {}
+
+try {
+    new stdClass(x: "nope");
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    new Test(x: "nope");
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Unknown named parameter $x
+Unknown named parameter $x
index ab231f952f0ca48302c9547fd16e86e60f160b40..1cec01591e9904b7eb0f8dc9ebc8bc333bbbff3e 100644 (file)
@@ -130,13 +130,12 @@ static ZEND_FUNCTION(pass)
 }
 
 ZEND_BEGIN_ARG_INFO_EX(zend_pass_function_arg_info, 0, 0, 0)
-       ZEND_ARG_VARIADIC_INFO(0, args)
 ZEND_END_ARG_INFO()
 
 ZEND_API const zend_internal_function zend_pass_function = {
        ZEND_INTERNAL_FUNCTION, /* type              */
        {0, 0, 0},              /* arg_flags         */
-       ZEND_ACC_VARIADIC,      /* fn_flags          */
+       0,                      /* fn_flags          */
        NULL,                   /* name              */
        NULL,                   /* scope             */
        NULL,                   /* prototype         */
@@ -1097,6 +1096,11 @@ static zend_never_inline ZEND_ATTRIBUTE_UNUSED bool zend_verify_internal_arg_typ
  * trust that arginfo matches what is enforced by zend_parse_parameters. */
 static zend_always_inline zend_bool zend_internal_call_should_throw(zend_function *fbc, zend_execute_data *call)
 {
+       if (fbc->internal_function.handler == ZEND_FN(pass)) {
+               /* Be lenient about the special pass function. */
+               return 0;
+       }
+
        if (fbc->common.required_num_args > ZEND_CALL_NUM_ARGS(call)) {
                /* Required argument not passed. */
                return 1;