diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-01-09 09:35:18 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-01-09 09:35:18 +0000 |
| commit | d56459bb8830ea8df10c06a8fd6b16f4dff54371 (patch) | |
| tree | 6f3b3aeab6e92295db1276e9d7d9d6bc81bb4bf9 /src/OptionParser.cc | |
| parent | e56f2afbbfee341cc1454f576495c79298f8f26c (diff) | |
2010-01-09 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed the bug that causes segmentation fault if unknown option is
put in aria2.conf file. BUG#2928303
* src/OptionParser.cc
* src/OptionParser.h
* src/option_processing.cc
* test/OptionParserTest.cc
Diffstat (limited to 'src/OptionParser.cc')
| -rw-r--r-- | src/OptionParser.cc | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/OptionParser.cc b/src/OptionParser.cc index 5216bd60..02f30dc8 100644 --- a/src/OptionParser.cc +++ b/src/OptionParser.cc @@ -48,10 +48,15 @@ #include "a2functional.h" #include "array_fun.h" #include "OptionHandlerFactory.h" +#include "Logger.h" +#include "LogFactory.h" namespace aria2 { -OptionParser::OptionParser():_idCounter(0) {} +OptionParser::OptionParser(): + _idCounter(0), + _logger(LogFactory::getInstance()) +{} template<typename InputIterator> static size_t countPublicOption(InputIterator first, InputIterator last) @@ -167,6 +172,9 @@ void OptionParser::parse(Option& option, std::istream& is) continue; } std::pair<std::string, std::string> nv = util::split(line, A2STR::EQUAL_C); + if(nv.first.empty()) { + continue; + } OptionHandlerHandle handler = getOptionHandlerByName(nv.first); handler->parse(option, nv.second); } @@ -191,10 +199,11 @@ OptionHandlerHandle OptionParser::getOptionHandlerByName std::vector<SharedHandle<OptionHandler> >::const_iterator i = std::lower_bound(_optionHandlers.begin(), _optionHandlers.end(), handler, OptionHandlerNameLesser()); - if(i == _optionHandlers.end()) { - handler.reset(new NullOptionHandler()); - } else { + if(i != _optionHandlers.end() && (*i)->canHandle(optName)) { handler = *i; + } else { + handler.reset(new NullOptionHandler()); + _logger->warn("Skipped unknown option --%s.", optName.c_str()); } return handler; } |
