From d56459bb8830ea8df10c06a8fd6b16f4dff54371 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 9 Jan 2010 09:35:18 +0000 Subject: 2010-01-09 Tatsuhiro Tsujikawa 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 --- src/OptionParser.cc | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'src/OptionParser.cc') 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 static size_t countPublicOption(InputIterator first, InputIterator last) @@ -167,6 +172,9 @@ void OptionParser::parse(Option& option, std::istream& is) continue; } std::pair 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 >::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; } -- cgit