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 | |
| 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')
| -rw-r--r-- | src/OptionParser.cc | 17 | ||||
| -rw-r--r-- | src/OptionParser.h | 3 | ||||
| -rw-r--r-- | src/option_processing.cc | 11 |
3 files changed, 23 insertions, 8 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; } diff --git a/src/OptionParser.h b/src/OptionParser.h index f9ec3ddc..57ced8f3 100644 --- a/src/OptionParser.h +++ b/src/OptionParser.h @@ -48,11 +48,14 @@ namespace aria2 { class Option; class OptionHandler; +class Logger; class OptionParser { private: int _idCounter; + Logger* _logger; + // _optionHandlers is sorted by OptionHandler::getName() in // ascending order. std::vector<SharedHandle<OptionHandler> > _optionHandlers; diff --git a/src/option_processing.cc b/src/option_processing.cc index 51021605..d97652b4 100644 --- a/src/option_processing.cc +++ b/src/option_processing.cc @@ -136,10 +136,13 @@ void option_processing(Option& op, std::deque<std::string>& uris, oparser.parse(op, cfstream); } catch(OptionHandlerException& e) { std::cerr << "Parse error in " << cfname << "\n" - << e.stackTrace() << "\n" - << "Usage:" << "\n" - << oparser.findByName(e.getOptionName())->getDescription() - << std::endl; + << e.stackTrace() << std::endl; + SharedHandle<OptionHandler> h = oparser.findByName(e.getOptionName()); + if(!h.isNull()) { + std::cerr << "Usage:" << "\n" + << oparser.findByName(e.getOptionName())->getDescription() + << std::endl; + } exit(downloadresultcode::UNKNOWN_ERROR); } catch(Exception& e) { std::cerr << "Parse error in " << cfname << "\n" |
