summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSara Golemon <sara.golemon@mongodb.com>2017-07-31 16:28:57 -0400
committerSara Golemon <sara.golemon@mongodb.com>2017-09-22 13:49:30 -0400
commit92d0529680c6481f1651f01374f93703ffd1c3f7 (patch)
treed5b2bd8bda1a0be29e1364006134eecf47ffdbdf /src
parenta8683cf5ac2d67624e1963ed7dc1c077223be3e8 (diff)
downloadmongo-92d0529680c6481f1651f01374f93703ffd1c3f7.tar.gz
SERVER-30361 Do not accept map/sequence for scalar config value
(cherry picked from commit 782672ef01d5903076b13e765cecedaea4981ecf)
Diffstat (limited to 'src')
-rw-r--r--src/mongo/util/options_parser/options_parser.cpp5
-rw-r--r--src/mongo/util/options_parser/options_parser_test.cpp76
2 files changed, 81 insertions, 0 deletions
diff --git a/src/mongo/util/options_parser/options_parser.cpp b/src/mongo/util/options_parser/options_parser.cpp
index 5d03910a390..63bf184ec85 100644
--- a/src/mongo/util/options_parser/options_parser.cpp
+++ b/src/mongo/util/options_parser/options_parser.cpp
@@ -341,6 +341,11 @@ Status YAMLNodeToValue(const YAML::Node& YAMLNode,
return Status::OK();
}
+ if (!YAMLNode.IsScalar() && !YAMLNode.IsNull()) {
+ return Status(ErrorCodes::BadValue,
+ str::stream() << "Scalar option '" << key << "' must be a single value");
+ }
+
// Our YAML parser reads everything as a string, so we need to parse it ourselves.
std::string stringVal = YAMLNode.Scalar();
return stringToValue(stringVal, type, key, value);
diff --git a/src/mongo/util/options_parser/options_parser_test.cpp b/src/mongo/util/options_parser/options_parser_test.cpp
index a0d97c512bb..aeb4a875914 100644
--- a/src/mongo/util/options_parser/options_parser_test.cpp
+++ b/src/mongo/util/options_parser/options_parser_test.cpp
@@ -1834,6 +1834,82 @@ TEST(Parsing, BadConfigFileOption) {
ASSERT_NOT_OK(parser.run(testOpts, argv, env_map, &environment));
}
+TEST(Parsing, MapForScalarMismatch) {
+ OptionsParserTester parser;
+ moe::Environment environment;
+ moe::OptionSection testOpts;
+
+ testOpts.addOptionChaining("config", "config", moe::Int, "Config file to parse");
+ testOpts.addOptionChaining("str", "str", moe::String, "");
+
+ std::vector<std::string> argv;
+ argv.push_back("binaryname");
+ argv.push_back("--config");
+ argv.push_back("config.json");
+ std::map<std::string, std::string> env_map;
+
+ parser.setConfig("config.json", R"cfg({ str: { elem: "val" } })cfg");
+
+ ASSERT_NOT_OK(parser.run(testOpts, argv, env_map, &environment));
+}
+
+TEST(Parsing, ScalarForMapMismatch) {
+ OptionsParserTester parser;
+ moe::Environment environment;
+ moe::OptionSection testOpts;
+
+ testOpts.addOptionChaining("config", "config", moe::Int, "Config file to parse");
+ testOpts.addOptionChaining("strmap", "strmap", moe::StringMap, "");
+
+ std::vector<std::string> argv;
+ argv.push_back("binaryname");
+ argv.push_back("--config");
+ argv.push_back("config.json");
+ std::map<std::string, std::string> env_map;
+
+ parser.setConfig("config.json", R"cfg({ str: "val" })cfg");
+
+ ASSERT_NOT_OK(parser.run(testOpts, argv, env_map, &environment));
+}
+
+TEST(Parsing, ListForScalarMismatch) {
+ OptionsParserTester parser;
+ moe::Environment environment;
+ moe::OptionSection testOpts;
+
+ testOpts.addOptionChaining("config", "config", moe::Int, "Config file to parse");
+ testOpts.addOptionChaining("str", "str", moe::String, "");
+
+ std::vector<std::string> argv;
+ argv.push_back("binaryname");
+ argv.push_back("--config");
+ argv.push_back("config.json");
+ std::map<std::string, std::string> env_map;
+
+ parser.setConfig("config.json", R"cfg({ str: ["val"] })cfg");
+
+ ASSERT_NOT_OK(parser.run(testOpts, argv, env_map, &environment));
+}
+
+TEST(Parsing, ScalarForListMismatch) {
+ OptionsParserTester parser;
+ moe::Environment environment;
+ moe::OptionSection testOpts;
+
+ testOpts.addOptionChaining("config", "config", moe::Int, "Config file to parse");
+ testOpts.addOptionChaining("strlist", "strlist", moe::StringVector, "");
+
+ std::vector<std::string> argv;
+ argv.push_back("binaryname");
+ argv.push_back("--config");
+ argv.push_back("config.json");
+ std::map<std::string, std::string> env_map;
+
+ parser.setConfig("config.json", R"cfg({ str: "val" })cfg");
+
+ ASSERT_NOT_OK(parser.run(testOpts, argv, env_map, &environment));
+}
+
TEST(ConfigFromFilesystem, JSONGood) {
moe::OptionsParser parser;
moe::Environment environment;