diff options
author | Sara Golemon <sara.golemon@mongodb.com> | 2017-07-31 16:28:57 -0400 |
---|---|---|
committer | Sara Golemon <sara.golemon@mongodb.com> | 2017-09-22 13:49:30 -0400 |
commit | 92d0529680c6481f1651f01374f93703ffd1c3f7 (patch) | |
tree | d5b2bd8bda1a0be29e1364006134eecf47ffdbdf /src | |
parent | a8683cf5ac2d67624e1963ed7dc1c077223be3e8 (diff) | |
download | mongo-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.cpp | 5 | ||||
-rw-r--r-- | src/mongo/util/options_parser/options_parser_test.cpp | 76 |
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; |