]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Merge in large patchset from GreenReaper, useful fixes for freeing a ton of different...
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Mon, 21 Apr 2008 16:59:23 +0000 (16:59 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Mon, 21 Apr 2008 16:59:23 +0000 (16:59 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@9565 e03df62e-2008-0410-955e-edbf42e46eb7

14 files changed:
include/ctables.h
include/usermanager.h
src/commands/cmd_die.cpp
src/configreader.cpp
src/dns.cpp
src/inspircd.cpp
src/mode.cpp
src/modes/cmode_l.cpp
src/modules.cpp
src/server.cpp
src/snomasks.cpp
src/xline.cpp
win/configure.cpp
win/m_spanningtreeVC80.vcproj

index fa0d42d74cda8af1641c2aa200ef09f064d1fcdd..ba6773a4ca9b0fa215d204746eaa616194cede8a 100644 (file)
@@ -167,7 +167,10 @@ class CoreExport Command : public Extensible
 
        /** Standard constructor gubbins
         */
-       virtual ~Command() {}
+       virtual ~Command()
+       {
+               syntax.clear();
+       }
 };
 
 /** A hash of commands used by the core
index 4c50c4292720251ec47471fcf0a54d5d4bc28bf0..3a9e151507b9b79ca2be8e372fe46d599cde8a0f 100644 (file)
@@ -32,7 +32,15 @@ class CoreExport UserManager : public classbase
        {
                ServerInstance = Instance;
        }
-
+       
+       ~UserManager()
+       {
+               for (user_hash::iterator i = clientlist->begin();i != clientlist->end();i++)
+               {
+                       delete i->second;
+               }
+               clientlist->clear();
+       }
 
        /** Client list, a hash_map containing all clients, local and remote
         */
index 761127dcbcc94f248ae85e5625ebc5689bdd99ff..2723ecca3067969a5406664d602d729bc8b8991c 100644 (file)
@@ -26,9 +26,11 @@ CmdResult CommandDie::Handle (const char* const* parameters, int pcnt, User *use
 {
        if (!ServerInstance->PassCompare(user, ServerInstance->Config->diepass, parameters[0], ServerInstance->Config->powerhash))
        {
-               std::string diebuf = std::string("*** DIE command from ") + user->nick + "!" + user->ident + "@" + user->dhost + ". Terminating in " + ConvToStr(ServerInstance->Config->DieDelay) + " seconds.";
-               ServerInstance->Logs->Log("COMMAND",SPARSE, diebuf);
-               ServerInstance->SendError(diebuf);
+               {
+                       std::string diebuf = std::string("*** DIE command from ") + user->nick + "!" + user->ident + "@" + user->dhost + ". Terminating in " + ConvToStr(ServerInstance->Config->DieDelay) + " seconds.";
+                       ServerInstance->Logs->Log("COMMAND",SPARSE, diebuf);
+                       ServerInstance->SendError(diebuf);
+               }
                
                if (ServerInstance->Config->DieDelay)
                        sleep(ServerInstance->Config->DieDelay);
index 29dff39caafc32176e3c24d4bb825740096af82b..e45a76b401c4b64b6c7aca5eda96ccf1a5c4e9e1 100644 (file)
@@ -36,7 +36,7 @@ bool DoneELine(ServerConfig* conf, const char* tag);
 ServerConfig::ServerConfig(InspIRCd* Instance) : ServerInstance(Instance)
 {
        this->ClearStack();
-       *ServerName = *Network = *ServerDesc = *AdminName = '\0';
+       *sid = *ServerName = *Network = *ServerDesc = *AdminName = '\0';
        *HideWhoisServer = *AdminEmail = *AdminNick = *diepass = *restartpass = *FixedQuit = *HideKillsServer = '\0';
        *DefaultModes = *CustomVersion = *motd = *rules = *PrefixQuit = *DieValue = *DNSServer = '\0';
        *UserStats = *ModPath = *MyExecutable = *DisabledCommands = *PID = *SuffixQuit = '\0';
@@ -1960,7 +1960,7 @@ bool ServerConfig::DirValid(const char* dirandfile)
 {
 #ifdef WINDOWS
        return true;
-#endif
+#else
 
        char work[1024];
        char buffer[1024];
@@ -2011,6 +2011,7 @@ bool ServerConfig::DirValid(const char* dirandfile)
        {
                return false;
        }
+#endif
 }
 
 std::string ServerConfig::GetFullProgDir()
index 2e393de537f12954862bf5b55e3d57e222b52389..ad59a98e4a5936661c39f2b92ea2dbbb6aeb2a6c 100644 (file)
@@ -934,7 +934,6 @@ DNS::~DNS()
        ServerInstance->SE->Shutdown(this, 2);
        ServerInstance->SE->Close(this);
        ServerInstance->Timers->DelTimer(this->PruneTimer);
-       delete this->PruneTimer;
 }
 
 CachedQuery* DNS::GetCache(const std::string &source)
index d533a6e450b035157bdb5d81f6a0adbfbf96029f..d09dff84067f35612d4942559e42a5288b5628ac 100644 (file)
@@ -112,15 +112,109 @@ void InspIRCd::Cleanup()
                        this->Modules->Unload(k->c_str());
                }
        }
-
-       /* Close logging */
-       this->Logs->CloseLogs();
+       /* Remove core commands */
+       Parser->RemoveCommands("<core>");
 
        /* Cleanup Server Names */
        for(servernamelist::iterator itr = servernames.begin(); itr != servernames.end(); ++itr)
                delete (*itr);
 
+       /* Delete objects dynamically allocated in constructor
+        * (destructor would be more appropriate, but we're likely exiting)
+        */
+
+       // Must be deleted before modes as it decrements modelines
+       if (this->Users)
+       {
+               delete this->Users;
+               this->Users = 0;
+       }
+       
+       if (this->Modes)
+       {
+               delete this->Modes;
+               this->Modes = 0;
+       }
+
+       if (this->XLines)
+       {
+               delete this->XLines;
+               this->XLines = 0;
+       }
 
+       if (this->Parser)
+       {
+               delete this->Parser;
+               this->Parser = 0;
+
+       if (this->stats)
+       {
+               delete this->stats;
+               this->stats = 0;
+       }
+
+       if (this->Modules)
+       {
+               delete this->Modules;
+               this->Modules = 0;
+       }
+
+       if (this->BanCache)
+               delete this->BanCache;
+               this->BanCache = 0;
+       }
+
+       if (this->SNO)
+       {
+               delete this->SNO;
+               this->SNO = 0;
+       }
+
+       if (this->Config)
+       {
+               delete this->Config;
+               this->Config = 0;
+       }
+
+       if (this->Res)
+       {
+               delete this->Res;
+               this->Res = 0;
+       }
+
+       if (this->chanlist)
+       {
+               delete chanlist;
+               chanlist = 0;
+       }
+
+       if (this->PI)
+       {
+               delete this->PI;
+               this->PI = 0;
+       }
+       
+       if (this->Threads)
+       {
+               delete this->Threads;
+               this->Threads = 0;
+       }
+
+       /* Needs to be deleted after Res, DNS has a timer */
+       if (this->Timers)
+       {
+               delete this->Timers;
+               this->Timers = 0;
+       }
+
+       /* Close logging */
+       this->Logs->CloseLogs();
+
+       if (this->Logs)
+       {
+               delete this->Logs;
+               this->Logs = 0;
+       }
 }
 
 void InspIRCd::Restart(const std::string &reason)
@@ -312,7 +406,11 @@ InspIRCd::InspIRCd(int argc, char** argv)
 
 {
 #ifdef WIN32
+       // Strict, frequent checking of memory on debug builds
        _CrtSetDbgFlag ( _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
+       
+       // Avoid erroneous frees on early exit
+       WindowsIPC = 0;
 #endif
        int found_ports = 0;
        FailedPortList pl;
@@ -320,6 +418,24 @@ InspIRCd::InspIRCd(int argc, char** argv)
            do_nolog = 0, do_root = 0, do_testsuite = 0;    /* flag variables */
        char c = 0;
 
+       // Initialize so that if we exit before proper initialization they're not deleted
+       this->Logs = 0;
+       this->Threads = 0;
+       this->PI = 0;
+       this->Users = 0;
+       this->chanlist = 0;
+       this->Config = 0;
+       this->SNO = 0;
+       this->BanCache = 0;
+       this->Modules = 0;
+       this->stats = 0;
+       this->Timers = 0;
+       this->Parser = 0;
+       this->XLines = 0;
+       this->Modes = 0;
+       this->Res = 0;
+
+
        memset(&server, 0, sizeof(server));
        memset(&client, 0, sizeof(client));
 
@@ -348,8 +464,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->Users->uuidlist = new user_hash();
        this->chanlist = new chan_hash();
 
-       this->Res = NULL;
-
        this->Config = new ServerConfig(this);
        this->SNO = new SnomaskManager(this);
        this->BanCache = new BanCacheManager(this);
@@ -530,6 +644,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
                Config->sid[0] = (char)(sid / 100 + 48);
                Config->sid[1] = (char)(((sid / 10) % 10) + 48);
                Config->sid[2] = (char)(sid % 10 + 48);
+               Config->sid[3] = '\0';
        }
 
        /* set up fake client again this time with the correct uid */
index e562a8551a39013f0becb0169b1a92bc68e53222..e5efaffdf0251e5eea61bb78a0d02690cdd883aa 100644 (file)
@@ -1125,9 +1125,8 @@ ModeParser::ModeParser(InspIRCd* Instance) : ServerInstance(Instance)
                NULL
        };
 
-       /* Clear mode list */
+       /* Clear mode handler list */
        memset(modehandlers, 0, sizeof(modehandlers));
-       memset(modewatchers, 0, sizeof(modewatchers));
 
        /* Last parse string */
        LastParse.clear();
index 5c9db31df00548842bb4e1164917eb9d7a3f0afe..4ed95bc2cdb934e6f3333861d5a9a8bda153af3a 100644 (file)
@@ -92,6 +92,4 @@ ModeAction ModeChannelLimit::OnModeChange(User*, User*, Channel* channel, std::s
 
                return MODEACTION_ALLOW;
        }
-
-       return MODEACTION_DENY;
 }
index df6876b1af765dcab77fce84697d7fb2bd3618ac..617d5a0fa64de280d5cdb6065e66312a9112c1c1 100644 (file)
@@ -602,14 +602,12 @@ bool ModuleManager::PublishInterface(const std::string &InterfaceName, Module* M
                modulelist ml;
                ml.push_back(Mod);
                Interfaces[InterfaceName] = std::make_pair(0, ml);
-               return true;
        }
        else
        {
                iter->second.second.push_back(Mod);
-               return true;
        }
-       return false;
+       return true;
 }
 
 bool ModuleManager::UnpublishInterface(const std::string &InterfaceName, Module* Mod)
index c713a028fe67ca47c9eb5ed42a1d1daafc20f267..ae1d106b8b7b7da4b13cf311cf35df7c2ade8dc0 100644 (file)
@@ -34,7 +34,8 @@ void InspIRCd::SignalHandler(int signal)
 void InspIRCd::Exit(int status)
 {
 #ifdef WINDOWS
-       delete WindowsIPC;
+       if (WindowsIPC)
+               delete WindowsIPC;
 #endif
        if (this)
        {
index de900623d48113e2331ac642ff80af23962429dd..e6323b50c743271fd41a1108409c03cea3d8b6e0 100644 (file)
@@ -24,7 +24,12 @@ SnomaskManager::SnomaskManager(InspIRCd* Instance) : ServerInstance(Instance)
 }
 
 SnomaskManager::~SnomaskManager()
-{
+{      
+       for (std::map<char, Snomask *>::iterator i = SnoMasks.begin(); i != SnoMasks.end(); i++)
+       {
+               delete i->second;
+       }
+       SnoMasks.clear();
 }
 
 void SnomaskManager::FlushSnotices()
index 47e12242053344ffe81d1000b51ac91b9fb869b8..610af2e6c305e332050c8fb9118270e3734c8547 100644 (file)
@@ -391,6 +391,18 @@ XLineManager::~XLineManager()
        delete KFact;
        delete QFact;
        delete ZFact;
+
+       // Delete all existing XLines
+       for (XLineContainer::iterator i = lookup_lines.begin(); i != lookup_lines.end(); i++)
+       {
+               for (XLineLookup::iterator j = i->second.begin(); j != i->second.end(); j++)
+               {
+                       delete j->second;
+               }
+               i->second.clear();
+       }
+       lookup_lines.clear();
+       
 }
 
 void XLine::Apply(User* u)
index a7351739ee1780e4c150f6c2de3f25e52be4010c..a6dab1ffd78d78fc7b8cfbdea4cff7220609c2f9 100644 (file)
@@ -552,7 +552,11 @@ void WriteCompileCommands()
        #endif
 #endif
 
-       fprintf(f, "makedir:\n  if not exist debug mkdir debug\n  if not exist release mkdir release\n\n");
+#ifdef _DEBUG
+       fprintf(f, "makedir:\n  if not exist debug mkdir debug\n  if not exist ..\\..\\bin\\debug\\lib mkdir ..\\..\\bin\\debug\\lib\n\n");
+#else
+       fprintf(f, "makedir:\n  if not exist release mkdir release\n  if not exist ..\\..\\bin\\release\\lib mkdir ..\\..\\bin\\release\\lib\n\n");
+#endif
        
        // dump modules.. again the second and last time :)
        for(int i = 0; i < command_count; ++i)
@@ -623,7 +627,11 @@ void WriteCompileModules()
        #endif
 #endif
        
-       fprintf(f, "makedir:\n  if not exist debug mkdir debug\n  if not exist release mkdir release\n\n");
+#ifdef _DEBUG
+       fprintf(f, "makedir:\n  if not exist debug mkdir debug\n  if not exist ..\\..\\bin\\debug\\modules mkdir ..\\..\\bin\\debug\\modules\n\n");
+#else
+       fprintf(f, "makedir:\n  if not exist release mkdir release\n  if not exist ..\\..\\bin\\release\\modules mkdir ..\\..\\bin\\release\\modules\n\n");
+#endif
 
        // dump modules.. again the second and last time :)
        for(int i = 0; i < module_count; ++i)
index 2367ef4ec18aca11a6bab68c88b55d656b023c8f..2477756d93a7b87358fa466332edafce003d47ef 100644 (file)
                        />\r
                </Configuration>\r
                <Configuration\r
-                       Name="Release|Win32"\r
-                       OutputDirectory="..\bin\release\modules"\r
-                       IntermediateDirectory="Release"\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="..\bin\debug_x64\modules"\r
+                       IntermediateDirectory="x64Debug_spanningtree"\r
                        ConfigurationType="2"\r
                        InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
                        CharacterSet="2"\r
                        />\r
                        <Tool\r
                                Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
-                               AdditionalOptions="/MP"\r
-                               Optimization="1"\r
-                               WholeProgramOptimization="true"\r
+                               Optimization="0"\r
                                AdditionalIncludeDirectories="..\include;..\win;..\src\modules\m_spanningtree;.;..\src\modules"\r
-                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;M_SPANNINGTREE_EXPORTS;DLL_BUILD"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DLL_BUILD;WIN64"\r
                                MinimalRebuild="true"\r
-                               RuntimeLibrary="2"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="1"\r
                                UsePrecompiledHeader="0"\r
-                               WarningLevel="2"\r
+                               WarningLevel="3"\r
                                Detect64BitPortabilityProblems="true"\r
                                DebugInformationFormat="3"\r
                        />\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
-                               AdditionalOptions="/MD"\r
-                               AdditionalDependencies="ws2_32.lib inspircd.lib cmd_whois.lib cmd_stats.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib"\r
+                               AdditionalDependencies="ws2_32.lib inspircd.lib cmd_whois.lib cmd_stats.lib"\r
                                OutputFile="$(OutDir)/m_spanningtree.so"\r
                                LinkIncremental="1"\r
-                               AdditionalLibraryDirectories="..\bin\release\bin;..\bin\release\lib"\r
+                               AdditionalLibraryDirectories="..\bin\debug_x64\bin;..\bin\debug_x64\lib"\r
                                GenerateDebugInformation="true"\r
+                               ProgramDatabaseFile="$(OutDir)/m_spanningtree.pdb"\r
                                SubSystem="2"\r
-                               OptimizeReferences="2"\r
-                               EnableCOMDATFolding="2"\r
-                               LinkTimeCodeGeneration="1"\r
                                ImportLibrary="$(OutDir)/m_spanningtree.lib"\r
-                               TargetMachine="1"\r
+                               TargetMachine="17"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCPostBuildEventTool"\r
-                               Description="Re-basing shared objects..."\r
-                               CommandLine="@cd $(InputDir)&#x0D;&#x0A;@$(InputDir)\rebase.bat&#x0D;&#x0A;"\r
                        />\r
                </Configuration>\r
                <Configuration\r
-                       Name="Debug|x64"\r
-                       OutputDirectory="..\bin\debug_x64\modules"\r
-                       IntermediateDirectory="x64Debug_spanningtree"\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="..\bin\release\modules"\r
+                       IntermediateDirectory="Release"\r
                        ConfigurationType="2"\r
                        InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
                        CharacterSet="2"\r
                        />\r
                        <Tool\r
                                Name="VCMIDLTool"\r
-                               TargetEnvironment="3"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
-                               Optimization="0"\r
+                               Optimization="1"\r
+                               WholeProgramOptimization="true"\r
                                AdditionalIncludeDirectories="..\include;..\win;..\src\modules\m_spanningtree;.;..\src\modules"\r
-                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DLL_BUILD;WIN64"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;M_SPANNINGTREE_EXPORTS;DLL_BUILD"\r
                                MinimalRebuild="true"\r
-                               BasicRuntimeChecks="3"\r
-                               RuntimeLibrary="1"\r
+                               RuntimeLibrary="2"\r
                                UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
+                               WarningLevel="2"\r
                                Detect64BitPortabilityProblems="true"\r
                                DebugInformationFormat="3"\r
                        />\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
-                               AdditionalDependencies="ws2_32.lib inspircd.lib cmd_whois.lib cmd_stats.lib"\r
+                               AdditionalOptions="/MD"\r
+                               AdditionalDependencies="ws2_32.lib inspircd.lib cmd_whois.lib cmd_stats.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib"\r
                                OutputFile="$(OutDir)/m_spanningtree.so"\r
                                LinkIncremental="1"\r
-                               AdditionalLibraryDirectories="..\bin\debug_x64\bin;..\bin\debug_x64\lib"\r
+                               AdditionalLibraryDirectories="..\bin\release\bin;..\bin\release\lib"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile="$(OutDir)/m_spanningtree.pdb"\r
                                SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="1"\r
                                ImportLibrary="$(OutDir)/m_spanningtree.lib"\r
-                               TargetMachine="17"\r
+                               TargetMachine="1"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCPostBuildEventTool"\r
+                               Description="Re-basing shared objects..."\r
+                               CommandLine="@cd $(InputDir)&#x0D;&#x0A;@&quot;$(InputDir)\rebase.bat&quot;&#x0D;&#x0A;"\r
                        />\r
                </Configuration>\r
                <Configuration\r