1
0
Fork 0

Abort with a clear error message for invalid uses of --config inside a config file

The options.cxx code is not ready to handle recursive use of --config
(for config files). Instead of failing in an ugly way, abort with a
clear error message in such situations. See discussion at
<https://sourceforge.net/p/flightgear/mailman/message/35838852/>.

Note: it *is* possible to load XML PropertyList files from config files,
      so --config is not entirely "banned" from config files.

+ add missing include
This commit is contained in:
Florent Rougon 2017-05-15 11:06:47 +02:00
parent 6ef8b5bf94
commit 034fb89db3
2 changed files with 17 additions and 6 deletions

View file

@ -39,6 +39,7 @@
#include <cstdlib> // atof(), atoi() #include <cstdlib> // atof(), atoi()
#include <cstring> // strcmp() #include <cstring> // strcmp()
#include <algorithm> #include <algorithm>
#include <map>
#include <iostream> #include <iostream>
#include <string> #include <string>
@ -2020,7 +2021,7 @@ void Options::init(int argc, char **argv, const SGPath& appDataPath)
continue; continue;
} }
int result = parseOption(argv[i]); int result = parseOption(argv[i], /* fromConfigFile */ false);
processArgResult(result); processArgResult(result);
} else { } else {
// XML properties file // XML properties file
@ -2231,7 +2232,7 @@ void Options::readConfig(const SGPath& path)
break; break;
line = line.substr( 0, i ); line = line.substr( 0, i );
if ( parseOption( line ) == FG_OPTIONS_ERROR ) { if ( parseOption(line, /* fromConfigFile */ true) == FG_OPTIONS_ERROR ) {
cerr << endl << "Config file parse error: " << path << " '" cerr << endl << "Config file parse error: " << path << " '"
<< line << "'" << endl; << line << "'" << endl;
p->showHelp = true; p->showHelp = true;
@ -2242,7 +2243,7 @@ void Options::readConfig(const SGPath& path)
p->insertGroupMarker(); // each config file is a group p->insertGroupMarker(); // each config file is a group
} }
int Options::parseOption(const string& s) int Options::parseOption(const string& s, bool fromConfigFile)
{ {
if ((s == "--help") || (s=="-h")) { if ((s == "--help") || (s=="-h")) {
return FG_OPTIONS_HELP; return FG_OPTIONS_HELP;
@ -2276,7 +2277,15 @@ int Options::parseOption(const string& s)
SGPath path = s.substr(9); SGPath path = s.substr(9);
if (path.extension() == "xml") { if (path.extension() == "xml") {
p->propertyFiles.push_back(path); p->propertyFiles.push_back(path);
} else { } else if (fromConfigFile) {
flightgear::fatalMessageBoxThenExit(
"FlightGear",
"Invalid use of the --config option.",
"Sorry, it is currently not supported to load a configuration file "
"using --config from another configuration file.\n\n"
"Note: this does not apply to loading of XML PropertyList files "
"with --config.");
} else { // the --config option comes from the command line
p->configFiles.push_back(path); p->configFiles.push_back(path);
} }

View file

@ -171,7 +171,9 @@ private:
// paths, etc. to stdout in JSON format, using the UTF-8 encoding. // paths, etc. to stdout in JSON format, using the UTF-8 encoding.
void printJSONReport() const; void printJSONReport() const;
int parseOption(const std::string& s); // The 'fromConfigFile' parameter indicates whether the option comes from a
// config file or directly from the command line.
int parseOption(const std::string& s, bool fromConfigFile);
void processArgResult(int result); void processArgResult(int result);