]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Fix memory leak discovered by nsmalloc.
authorChris Porter <redacted>
Thu, 2 Oct 2008 02:04:07 +0000 (03:04 +0100)
committerChris Porter <redacted>
Thu, 2 Oct 2008 02:04:07 +0000 (03:04 +0100)
Fix double registration of commands.

trusts/events.c
trusts/migration.c
trusts/trusts_commands.c

index a5492f2909dc14207f27d42c2fbf95f31a62966c..34c6b0b4c6d98541e060df29fee0e72825371b61 100644 (file)
@@ -74,10 +74,16 @@ static void __counthandler(int hooknum, void *arg) {
   }
 }
 
+static int hooksregistered;
+
 static void __dbloaded(int hooknum, void *arg) {
   int i;
   nick *np;
 
+  if(hooksregistered)
+    return;
+  hooksregistered = 1;
+
   registerhook(HOOK_NICK_NEWNICK, __newnick);
   registerhook(HOOK_NICK_LOSTNICK, __lostnick);
 
@@ -99,15 +105,17 @@ void trusts_registerevents(void) {
 }
 
 void trusts_deregisterevents(void) {
-  if(trustsdbloaded) {
-    deregisterhook(HOOK_NICK_NEWNICK, __newnick);
-    deregisterhook(HOOK_NICK_LOSTNICK, __lostnick);
+  deregisterhook(HOOK_TRUSTS_DB_LOADED, __dbloaded);
+
+  if(!hooksregistered)
+    return;
+  hooksregistered = 0;
+
+  deregisterhook(HOOK_NICK_NEWNICK, __newnick);
+  deregisterhook(HOOK_NICK_LOSTNICK, __lostnick);
 
 /*
-    deregisterhook(HOOK_TRUSTS_NEWNICK, __counthandler);
-    deregisterhook(HOOK_TRUSTS_LOSTNICK, __counthandler);
+  deregisterhook(HOOK_TRUSTS_NEWNICK, __counthandler);
+  deregisterhook(HOOK_TRUSTS_LOSTNICK, __counthandler);
 */
-  }
-
-  deregisterhook(HOOK_TRUSTS_DB_LOADED, __dbloaded);
 }
index ac3bf919584b8c0b507bb794c8c0e4f57a367634..578fef8267cd791f00b8a61dea083107855fa315 100644 (file)
@@ -173,7 +173,7 @@ static void tm_trustdump(trustmigration *tm) {
   char buf[100];
 
   if(tm->cur >= tm->count) {
-    tm->fini(tm->tag, 0);
+    tm_fini(tm, 0);
     return;
   }
 
index c1fcc871cc596c87cdb20ef66ff1c4f978cf2711..69aa2182290dd2a083006e68a8f6a82495561816 100644 (file)
@@ -4,7 +4,7 @@
 
 int trusts_migration_start(TrustDBMigrationCallback, void *);
 void trusts_migration_stop(void);
-static void registercommands(void);
+static void registercommands(int hooknum, void *arg);
 static void deregistercommands(void);
 
 static void migrate_status(int errcode, void *tag) {
@@ -24,7 +24,7 @@ static void migrate_status(int errcode, void *tag) {
     controlreply(np, "All functionality disabled, database unloaded -- please reload the module.");
   } else {
     controlreply(np, "Error %d occured during migration, commands reregistered.", errcode);
-    registercommands();
+    registercommands(0, NULL);
   }
 }
 
@@ -115,33 +115,37 @@ static int trusts_cmdtrustlist(void *source, int cargc, char **cargv) {
   return CMD_OK;
 }
 
-static void dbloaded(int hooknum, void *arg) {
-  registercommands();
+static int commandsregistered;
+
+static void registercommands(int hooknum, void *arg) {
+  if(commandsregistered)
+    return;
+  commandsregistered = 1;
+
+  registercontrolhelpcmd("trustmigrate", NO_DEVELOPER, 0, trusts_cmdmigrate, "Usage: trustmigrate\nCopies trust data from O and reloads the database.");
+  registercontrolhelpcmd("trustlist", NO_OPER, 1, trusts_cmdtrustlist, "Usage: trustlist <#id|name|id>\nShows trust data for the specified trust group.");
+}
+
+static void deregistercommands(void) {
+  if(!commandsregistered)
+    return;
+  commandsregistered = 0;
+
+  deregistercontrolcmd("trustmigrate", trusts_cmdmigrate);
+  deregistercontrolcmd("trustlist", trusts_cmdtrustlist);
 }
 
 void _init(void) {
-  registerhook(HOOK_TRUSTS_DB_LOADED, dbloaded);
+  registerhook(HOOK_TRUSTS_DB_LOADED, registercommands);
 
   if(trustsdbloaded)
-    registercommands();
+    registercommands(0, NULL);
 }
 
 void _fini(void) {
-  deregisterhook(HOOK_TRUSTS_DB_LOADED, dbloaded);
+  deregisterhook(HOOK_TRUSTS_DB_LOADED, registercommands);
   deregistercommands();
 
   trusts_migration_stop();
 }
 
-static void registercommands(void) {
-  registercontrolhelpcmd("trustmigrate", NO_DEVELOPER, 0, trusts_cmdmigrate, "Usage: trustmigrate\nCopies trust data from O and reloads the database.");
-  registercontrolhelpcmd("trustlist", NO_OPER, 1, trusts_cmdtrustlist, "Usage: trustlist <#id|name|id>\nShows trust data for the specified trust group.");
-}
-
-static void deregistercommands(void) {
-  if(!trustsdbloaded)
-    return;
-
-  deregistercontrolcmd("trustmigrate", trusts_cmdmigrate);
-  deregistercontrolcmd("trustlist", trusts_cmdtrustlist);
-}