From 33141a0825e7cf2dcd0cae63da8943626d8a06b6 Mon Sep 17 00:00:00 2001 From: danieldg Date: Mon, 19 Oct 2009 04:09:30 +0000 Subject: [PATCH] Close files opened by configreader git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11915 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/logger.h | 14 ++----------- src/configreader.cpp | 48 ++++++++++++++++++++++++++------------------ src/logger.cpp | 16 +++++++++++++++ src/mode.cpp | 7 ++++--- 4 files changed, 50 insertions(+), 35 deletions(-) diff --git a/include/logger.h b/include/logger.h index 4914e86a2..e3b7ee0a5 100644 --- a/include/logger.h +++ b/include/logger.h @@ -147,18 +147,8 @@ class CoreExport LogManager public: - LogManager() - { - noforkstream = NULL; - Logging = false; - } - - ~LogManager() - { - if (noforkstream) - delete noforkstream; - Logging = true; - } + LogManager(); + ~LogManager(); /** Sets up the logstream for -nofork. Called by InspIRCd::OpenLog() and LogManager::OpenFileLogs(). * First time called it creates the nofork stream and stores it in noforkstream. Each call thereafter just readds it to GlobalLogStreams diff --git a/src/configreader.cpp b/src/configreader.cpp index 80d123842..545ff86c2 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -203,7 +203,9 @@ struct Parser nextword(name); int spc = next(); - if (!isspace(spc)) + if (spc == '>') + unget(spc); + else if (!isspace(spc)) throw CoreException("Invalid character in tag name"); if (name.empty()) @@ -303,6 +305,20 @@ void ParseStack::DoInclude(ConfigTag* tag, int flags) } } +/** RAII wrapper on FILE* to close files on exceptions */ +struct FileWrapper +{ + FILE* const f; + FileWrapper(FILE* file) : f(file) {} + operator bool() { return f; } + operator FILE*() { return f; } + ~FileWrapper() + { + if (f) + fclose(f); + } +}; + bool ParseStack::ParseFile(const std::string& name, int flags) { ServerInstance->Logs->Log("CONFIG", DEBUG, "Reading file %s", name.c_str()); @@ -316,7 +332,7 @@ bool ParseStack::ParseFile(const std::string& name, int flags) /* It's not already included, add it to the list of files we've loaded */ - FILE* file = fopen(name.c_str(), "r"); + FileWrapper file(fopen(name.c_str(), "r")); if (!file) throw CoreException("Could not read \"" + name + "\" for include"); @@ -340,7 +356,7 @@ bool ParseStack::ParseExec(const std::string& name, int flags) /* It's not already included, add it to the list of files we've loaded */ - FILE* file = popen(name.c_str(), "r"); + FileWrapper file(popen(name.c_str(), "r")); if (!file) throw CoreException("Could not open executable \"" + name + "\" for include"); @@ -1245,31 +1261,23 @@ bool ServerConfig::ReadFile(file_cache &F, const std::string& fname) if (fname.empty()) return false; - FILE* file = NULL; char linebuf[MAXBUF]; F.clear(); - if (!FileExists(fname.c_str())) - return false; - file = fopen(fname.c_str(), "r"); + FileWrapper file(fopen(fname.c_str(), "r")); - if (file) + if (!file) + return false; + while (!feof(file)) { - while (!feof(file)) - { - if (fgets(linebuf, sizeof(linebuf), file)) - linebuf[strlen(linebuf)-1] = 0; - else - *linebuf = 0; - - F.push_back(*linebuf ? linebuf : " "); - } + if (fgets(linebuf, sizeof(linebuf), file)) + linebuf[strlen(linebuf)-1] = 0; + else + *linebuf = 0; - fclose(file); + F.push_back(*linebuf ? linebuf : " "); } - else - return false; return true; } diff --git a/src/logger.cpp b/src/logger.cpp index be28bf836..19e07e78f 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -42,6 +42,22 @@ * */ +LogManager::LogManager() +{ + noforkstream = NULL; + Logging = false; +} + +LogManager::~LogManager() +{ + if (noforkstream) + { + ServerInstance->Logs = this; + delete noforkstream; + ServerInstance->Logs = NULL; + } +} + void LogManager::SetupNoFork() { if (!noforkstream) diff --git a/src/mode.cpp b/src/mode.cpp index 47553f238..65a027e90 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -55,13 +55,14 @@ ModeHandler::ModeHandler(Module* Creator, const std::string& Name, char modelett CullResult ModeHandler::cull() { - ServerInstance->Modes->DelMode(this); + if (ServerInstance->Modes) + ServerInstance->Modes->DelMode(this); return classbase::cull(); } ModeHandler::~ModeHandler() { - if (ServerInstance && ServerInstance->Modes->FindMode(mode, m_type) == this) + if (ServerInstance && ServerInstance->Modes && ServerInstance->Modes->FindMode(mode, m_type) == this) ServerInstance->Logs->Log("MODE", DEBUG, "ERROR: Destructor for mode %c called while not culled", mode); } @@ -1026,7 +1027,7 @@ ModeParser::ModeParser() ModeParser::~ModeParser() { - ModeHandler* mh = ServerInstance->Modes->FindMode('h', MODETYPE_CHANNEL); + ModeHandler* mh = FindMode('h', MODETYPE_CHANNEL); if (mh) { mh->cull(); -- 2.39.2