summaryrefslogtreecommitdiff
path: root/src/inspircd.cpp
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2008-04-21 16:59:23 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2008-04-21 16:59:23 +0000
commit98659aa0dcac7636627846555ef7d5f807152b7e (patch)
tree4726b3771ad6874862f2ff7b503264eed617f8d4 /src/inspircd.cpp
parentf21617328a8a576c8ada619f2934ac31f0dec717 (diff)
Merge in large patchset from GreenReaper, useful fixes for freeing a ton of different things on shutdown for tidyness, and a few stack corruption fixes in the mode handler
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@9565 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/inspircd.cpp')
-rw-r--r--src/inspircd.cpp125
1 files changed, 120 insertions, 5 deletions
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index d533a6e45..d09dff840 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -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 */