Check that toolchain is passed exactly one argument
The toolchain function was not checking that the number of
passed argument was correct (and thus accessing a vector
at an invalid index which is undefined behaviour).
Insert call to EnsureSingleStringArg to reuse the generic
check shared by other generic function.
Bug: 45
Change-Id: I9d06fba50d94d5d542dfaff45d378ffe78958803
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/9021
Commit-Queue: Nico Weber <thakis@chromium.org>
Reviewed-by: Nico Weber <thakis@chromium.org>
diff --git a/src/gn/function_toolchain.cc b/src/gn/function_toolchain.cc
index 92721dc..0ff5d34 100644
--- a/src/gn/function_toolchain.cc
+++ b/src/gn/function_toolchain.cc
@@ -196,6 +196,9 @@
!EnsureNotProcessingBuildConfig(function, scope, err))
return Value();
+ if (!EnsureSingleStringArg(function, args, err))
+ return Value();
+
// Note that we don't want to use MakeLabelForScope since that will include
// the toolchain name in the label, and toolchain labels don't themselves
// have toolchain names.
diff --git a/src/gn/function_toolchain_unittest.cc b/src/gn/function_toolchain_unittest.cc
index 2229495..ba4bfb6 100644
--- a/src/gn/function_toolchain_unittest.cc
+++ b/src/gn/function_toolchain_unittest.cc
@@ -11,6 +11,30 @@
using FunctionToolchain = TestWithScheduler;
+TEST_F(FunctionToolchain, NoArguments) {
+ TestWithScope setup;
+
+ // Check that creating a toolchain with no name reports an error.
+ {
+ TestParseInput input(R"(toolchain() {})");
+ ASSERT_FALSE(input.has_error());
+
+ Err err;
+ input.parsed()->Execute(setup.scope(), &err);
+ ASSERT_TRUE(err.has_error()) << err.message();
+ }
+
+ // Check that creating a toolchain with too many arguments is an error.
+ {
+ TestParseInput input(R"(toolchain("too", "many", "arguments") {})");
+ ASSERT_FALSE(input.has_error());
+
+ Err err;
+ input.parsed()->Execute(setup.scope(), &err);
+ ASSERT_TRUE(err.has_error()) << err.message();
+ }
+}
+
TEST_F(FunctionToolchain, RuntimeOutputs) {
TestWithScope setup;