summaryrefslogtreecommitdiff
path: root/qpid/cpp/src
diff options
context:
space:
mode:
authorMichael Goulish <mgoulish@apache.org>2013-01-09 19:23:36 +0000
committerMichael Goulish <mgoulish@apache.org>2013-01-09 19:23:36 +0000
commit3ed97638930d25aee20dc931b38cb2767414e58c (patch)
tree4b063bca86fb7146e57534578a363488b26bceaf /qpid/cpp/src
parent9a2b1d265d0816b2348ed9797ef5a3b2604a4d7e (diff)
downloadqpid-python-3ed97638930d25aee20dc931b38cb2767414e58c.tar.gz
QPID-4518 : disallow unknown args in config file
Change EnvOptMapper::configFileLine to take ar arg telling it if it's OK to have unknown args or not. If not, throw upon encountering. From the higher level of run_broker(), there are two passes of arg parsing. In the first pass it's normal to have unknown args, because the loadable modules are not loaded yet. But I change the second parsing to pass down the arg that says "unknowns are not okay." git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1431016 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r--qpid/cpp/src/qpid/Options.cpp53
-rw-r--r--qpid/cpp/src/qpidd.cpp6
2 files changed, 45 insertions, 14 deletions
diff --git a/qpid/cpp/src/qpid/Options.cpp b/qpid/cpp/src/qpid/Options.cpp
index b96fc59dda..c0e955e2b3 100644
--- a/qpid/cpp/src/qpid/Options.cpp
+++ b/qpid/cpp/src/qpid/Options.cpp
@@ -74,14 +74,28 @@ struct EnvOptMapper {
}
- string configFileLine (string& line) {
+ void badArg ( string& line ) {
+ ostringstream msg;
+ msg << "Bad argument: |" << line << "|\n";
+ throw Exception(msg.str());
+ }
- if ( isComment ( line ) )
- return string();
- size_t pos = line.find ('=');
- if (pos == string::npos)
+ string configFileLine (string& line, bool allowUnknowns=true) {
+
+ if ( isComment ( line ) ) {
return string();
+ }
+
+ size_t pos = line.find ('=');
+ if (pos == string::npos) {
+ if ( allowUnknowns ) {
+ return string();
+ }
+ else {
+ badArg ( line );
+ }
+ }
string key = line.substr (0, pos);
#if (BOOST_VERSION >= 103300)
typedef const std::vector< boost::shared_ptr<po::option_description> > OptDescs;
@@ -89,16 +103,31 @@ struct EnvOptMapper {
find_if(opts.options().begin(), opts.options().end(), boost::bind(matchCase, key, _1));
if (i != opts.options().end())
return string (line) + "\n";
- else
- return string();
+ else {
+ if ( allowUnknowns ) {
+ return string();
+ }
+ else {
+ badArg ( line );
+ }
+ }
#else
- // Use 'count' to see if this option exists. Using 'find' will SEGV or hang
- // if the option has not been defined yet.
+ // Use 'count' to see if this option exists. Using 'find' will
+ // SEGV or hang if the option has not been defined yet.
if ( opts.count(key.c_str()) > 0 )
return string ( line ) + "\n";
- else
- return string ( );
+ else {
+ if ( allowUnknowns ) {
+ return string ( );
+ }
+ else {
+ badArg ( line );
+ }
+ }
#endif
+ // Control will not arrive here, but the compiler things it could.
+ // Calls to badArg(), that I used above, throw.
+ return string();
}
const Options& opts;
@@ -160,7 +189,7 @@ void Options::parse(int argc, char const* const* argv, const std::string& config
while (!conf.eof()) {
string line;
getline (conf, line);
- filtered << mapper.configFileLine (line);
+ filtered << mapper.configFileLine (line, allowUnknown);
}
po::store(po::parse_config_file(filtered, *this), vm);
diff --git a/qpid/cpp/src/qpidd.cpp b/qpid/cpp/src/qpidd.cpp
index 8e0c52f770..e17dea3164 100644
--- a/qpid/cpp/src/qpidd.cpp
+++ b/qpid/cpp/src/qpidd.cpp
@@ -82,10 +82,12 @@ int run_broker(int argc, char *argv[], bool hidden)
qpid::loadModuleDir (bootOptions.module.loadDir, isDefault);
}
- // Parse options
+ // Parse options. In the second pass, do not allow unknown options.
+ // All the modules have been added now, so any unknown options
+ // should be flagged as errors.
try {
options.reset(new QpiddOptions(argv[0]));
- options->parse(argc, argv, options->common.config);
+ options->parse(argc, argv, options->common.config, false);
} catch (const std::exception& /*e*/) {
if (helpArgSeen) {
// provide help even when parsing fails