diff options
author | Sara Golemon <sara.golemon@mongodb.com> | 2019-07-02 15:37:23 +0000 |
---|---|---|
committer | Sara Golemon <sara.golemon@mongodb.com> | 2019-07-08 23:59:33 +0000 |
commit | 96bb83d7fd650605413186a42a5de16289673d35 (patch) | |
tree | 18c31935b7a59e74b5174726a73c7e13b8558e5c | |
parent | 3ed19ce7c51a84999fa85ba5b644f4972e7037cb (diff) | |
download | mongo-96bb83d7fd650605413186a42a5de16289673d35.tar.gz |
SERVER-41903 Validate server parameter names during config validation
(cherry picked from commit f8cdf774a81b3af8825ac76eaebef1fd48183b5a)
-rw-r--r-- | jstests/noPassthrough/unknown-set-parameter.js | 36 | ||||
-rw-r--r-- | src/mongo/db/server_options_helpers.cpp | 17 | ||||
-rw-r--r-- | src/mongo/util/options_parser/options_parser_init.cpp | 10 |
3 files changed, 63 insertions, 0 deletions
diff --git a/jstests/noPassthrough/unknown-set-parameter.js b/jstests/noPassthrough/unknown-set-parameter.js new file mode 100644 index 00000000000..1e72694e276 --- /dev/null +++ b/jstests/noPassthrough/unknown-set-parameter.js @@ -0,0 +1,36 @@ +// Verify error is produced when specifying an invalid set parameter. + +(function() { + 'use strict'; + + function tryRun(arg) { + // runMongoProgram helpfully makes certain that we pass a port when invoking mongod. + return runMongoProgram('./mongod', '--port', 0, '--setParameter', arg, '--outputConfig'); + } + + // Positive case, valid setparam. + clearRawMongoProgramOutput(); + const valid = tryRun('enableTestCommands=1'); + assert.eq(valid, 0); + const validOutput = rawMongoProgramOutput(); + assert.gte(validOutput.search(/enableTestCommands: 1/), 0, validOutput); + + // Negative case, invalid setparam. + clearRawMongoProgramOutput(); + const foo = tryRun('foo=bar'); + assert.neq(foo, 0); + const fooOutput = rawMongoProgramOutput(); + assert.gte(fooOutput.search(/Unknown --setParameter 'foo'/), 0, fooOutput); + + // Negative case, valid but unavailable setparam. + clearRawMongoProgramOutput(); + const graph = tryRun('roleGraphInvalidationIsFatal=true'); + assert.neq(graph, 0); + const graphOutput = rawMongoProgramOutput(); + assert.gte( + graphOutput.search( + /--setParameter 'roleGraphInvalidationIsFatal' only available when used with 'enableTestCommands'/), + 0, + fooOutput); + +}()); diff --git a/src/mongo/db/server_options_helpers.cpp b/src/mongo/db/server_options_helpers.cpp index 4a9e1a3acef..379ba8154b8 100644 --- a/src/mongo/db/server_options_helpers.cpp +++ b/src/mongo/db/server_options_helpers.cpp @@ -46,6 +46,7 @@ #include "mongo/bson/util/builder.h" #include "mongo/config.h" #include "mongo/db/server_options.h" +#include "mongo/idl/server_parameter.h" #include "mongo/logger/log_component.h" #include "mongo/logger/message_event_utf8_encoder.h" #include "mongo/transport/message_compressor_registry.h" @@ -150,6 +151,22 @@ Status validateBaseOptions(const moe::Environment& params) { // Deregister test-only parameters. ServerParameterSet::getGlobal()->disableTestParameters(); } + + // Must come after registerAllFailPointsAsServerParameters() above. + const auto& spMap = ServerParameterSet::getGlobal()->getMap(); + for (const auto setParam : parameters) { + const auto it = spMap.find(setParam.first); + + if (it == spMap.end()) { + return {ErrorCodes::BadValue, + str::stream() << "Unknown --setParameter '" << setParam.first << "'"}; + } + if (!enableTestCommandsValue && it->second->isTestOnly()) { + return {ErrorCodes::BadValue, + str::stream() << "--setParameter '" << setParam.first + << "' only available when used with 'enableTestCommands'"}; + } + } } return Status::OK(); diff --git a/src/mongo/util/options_parser/options_parser_init.cpp b/src/mongo/util/options_parser/options_parser_init.cpp index c484518ca3d..d6e20ffe045 100644 --- a/src/mongo/util/options_parser/options_parser_init.cpp +++ b/src/mongo/util/options_parser/options_parser_init.cpp @@ -40,6 +40,7 @@ namespace mongo { namespace optionenvironment { +namespace { MONGO_STARTUP_OPTIONS_PARSE(StartupOptions)(InitializerContext* context) { OptionsParser parser; @@ -50,6 +51,14 @@ MONGO_STARTUP_OPTIONS_PARSE(StartupOptions)(InitializerContext* context) { std::cerr << "try '" << context->args()[0] << " --help' for more information" << std::endl; quickExit(EXIT_BADOPTIONS); } + + return Status::OK(); +} + +MONGO_INITIALIZER_GENERAL(OutputConfig, + ("EndStartupOptionValidation"), + ("BeginStartupOptionStorage")) +(InitializerContext*) { if (startupOptionsParsed.count("outputConfig")) { bool output = false; auto status = startupOptionsParsed.get(Key("outputConfig"), &output); @@ -64,5 +73,6 @@ MONGO_STARTUP_OPTIONS_PARSE(StartupOptions)(InitializerContext* context) { return Status::OK(); } +} // namespace } // namespace optionenvironment } // namespace mongo |