Core/Logging: Fix all possible crashes when using bad Appender config settings

This commit is contained in:
Spp
2013-01-24 16:56:32 +01:00
parent cc605e0605
commit 53a3373a98

View File

@@ -89,8 +89,9 @@ void Log::CreateAppenderFromConfig(const char* name)
options = ConfigMgr::GetStringDefault(options.c_str(), ""); options = ConfigMgr::GetStringDefault(options.c_str(), "");
Tokenizer tokens(options, ','); Tokenizer tokens(options, ',');
Tokenizer::const_iterator iter = tokens.begin(); Tokenizer::const_iterator iter = tokens.begin();
uint8 size = tokens.size();
if (tokens.size() < 2) if (size < 2)
{ {
fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong configuration for appender %s. Config line: %s\n", name, options.c_str()); fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong configuration for appender %s. Config line: %s\n", name, options.c_str());
return; return;
@@ -98,16 +99,15 @@ void Log::CreateAppenderFromConfig(const char* name)
AppenderFlags flags = APPENDER_FLAGS_NONE; AppenderFlags flags = APPENDER_FLAGS_NONE;
AppenderType type = AppenderType(atoi(*iter)); AppenderType type = AppenderType(atoi(*iter));
++iter; LogLevel level = LogLevel(atoi(*(++iter)));
LogLevel level = LogLevel(atoi(*iter));
if (level > LOG_LEVEL_FATAL) if (level > LOG_LEVEL_FATAL)
{ {
fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong Log Level %d for appender %s\n", level, name); fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong Log Level %d for appender %s\n", level, name);
return; return;
} }
if (++iter != tokens.end()) if (size > 2)
flags = AppenderFlags(atoi(*iter)); flags = AppenderFlags(atoi(*(++iter)));
switch (type) switch (type)
{ {
@@ -115,7 +115,7 @@ void Log::CreateAppenderFromConfig(const char* name)
{ {
AppenderConsole* appender = new AppenderConsole(NextAppenderId(), name, level, flags); AppenderConsole* appender = new AppenderConsole(NextAppenderId(), name, level, flags);
appenders[appender->getId()] = appender; appenders[appender->getId()] = appender;
if (++iter != tokens.end()) if (iter != tokens.end())
appender->InitColors(*iter); appender->InitColors(*iter);
//fprintf(stdout, "Log::CreateAppenderFromConfig: Created Appender %s (%u), Type CONSOLE, Mask %u\n", appender->getName().c_str(), appender->getId(), appender->getLogLevel()); // DEBUG - RemoveMe //fprintf(stdout, "Log::CreateAppenderFromConfig: Created Appender %s (%u), Type CONSOLE, Mask %u\n", appender->getName().c_str(), appender->getId(), appender->getLogLevel()); // DEBUG - RemoveMe
break; break;
@@ -125,16 +125,16 @@ void Log::CreateAppenderFromConfig(const char* name)
std::string filename; std::string filename;
std::string mode = "a"; std::string mode = "a";
if (++iter == tokens.end()) if (size < 4)
{ {
fprintf(stderr, "Log::CreateAppenderFromConfig: Missing file name for appender %s\n", name); fprintf(stderr, "Log::CreateAppenderFromConfig: Missing file name for appender %s\n", name);
return; return;
} }
filename = *iter; filename = *(++iter);
if (++iter != tokens.end()) if (size > 4)
mode = *iter; mode = *(++iter);
if (flags & APPENDER_FLAGS_USE_TIMESTAMP) if (flags & APPENDER_FLAGS_USE_TIMESTAMP)
{ {
@@ -146,11 +146,8 @@ void Log::CreateAppenderFromConfig(const char* name)
} }
uint64 maxFileSize = 0; uint64 maxFileSize = 0;
if ( (iter != tokens.end()) && (++iter != tokens.end()) ) if (size > 5)
{ maxFileSize = atoi(*(++iter));
char const* c = *iter;
maxFileSize = atoi(c);
}
uint8 id = NextAppenderId(); uint8 id = NextAppenderId();
appenders[id] = new AppenderFile(id, name, level, filename.c_str(), m_logsDir.c_str(), mode.c_str(), flags, maxFileSize); appenders[id] = new AppenderFile(id, name, level, filename.c_str(), m_logsDir.c_str(), mode.c_str(), flags, maxFileSize);