]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Make valgrind a bit happier.
authorsplidge <redacted>
Sat, 2 Jun 2007 16:23:07 +0000 (17:23 +0100)
committersplidge <redacted>
Sat, 2 Jun 2007 16:23:07 +0000 (17:23 +0100)
Added some new pools to nsmalloc.
Updated nick and sstring to use nsmalloc.
Changed chanservdb to use nsmalloc instead of its previous similar thing.
Made the core free up the sstring memory when it exits, and also check for
any outstanding blocks in nsmalloc.

Sundry change to allow opers to override chanserv commands by default snuck
in too.

chanserv/chanservprivs.c
chanserv/database/chanservdb.c
chanserv/database/chanservdb_alloc.c
core/main.c
core/nsmalloc.c
core/nsmalloc.h
lib/sstring.c
nick/nick.c
nick/nickalloc.c

index fbb1b73947b710bde983ec6f79a0efdc779633b1..3b70fa71f62f59a1614ad79e72edb9a9298f8527 100644 (file)
@@ -33,8 +33,8 @@ int cs_privcheck(int privnum, nick *np) {
   case QPRIV_CHANGEUSERFLAGS:
     return (np && rup && IsOper(np) && UHasOperPriv(rup));
     
-  default:
-    return 0;
+  default: /* By default opers can override anything */
+    return (np && rup && IsOper(np) && UHasOperPriv(rup));
   }
 }
 
index 99d86ada31ed418b29f08ccecac95eec81256abd..515e4ed395bba109f8dd33516f9d6fffdcf3ed5a 100644 (file)
@@ -9,6 +9,7 @@
 #include "../../lib/sstring.h"
 #include "../../parser/parser.h"
 #include "../../core/events.h"
+#include "../../core/nsmalloc.h"
 
 #include <string.h>
 #include <libpq-fe.h>
@@ -204,7 +205,7 @@ void _fini() {
     releaseauthnameext(chanservaext);
     
   csdb_freestuff();
-  csfreeall();
+  nsfreeall(POOL_CHANSERVDB);
 }
 
 void csdb_handlestats(int hooknum, void *arg) {
index c67223bd63fbe0a6341f02bb06174b2c53ba6017..2d7ca658aa43c306929d59898bd3c7022ddf2a90 100644 (file)
@@ -4,6 +4,8 @@
  */
 
 #include "../chanserv.h"
+#include "../../core/nsmalloc.h"
+
 #include <stdlib.h>
 
 #define ALLOCUNIT 100
@@ -24,40 +26,6 @@ void chanservallocinit() {
   csfreenicklists=NULL;
   csfreeregbans=NULL;
   csfreeactiveusers=NULL;
-  csmallocs=NULL;
-}
-
-void *csmalloc(size_t size) {
-  void **mem;
-  
-  /* Get the requested memory, with one extra pointer at the beginning */
-  mem=(void **)malloc(size+sizeof(void *));
-
-  /* Set the first word to point at the last thing we got */
-  *mem=csmallocs;
-
-  /* Now set the "last chunk" pointer to the address of this one */
-  csmallocs=(void *)mem;
-  
-  /* return the rest of the memory to the caller */
-  return (void *)(mem+1);
-}
-
-/*
- * csfreeall():
- *  Free all the memory we allocated for chanserv structures.
- */
-
-void csfreeall() {
-  void *vp,**vh;
-
-  vp=csmallocs;
-
-  while (vp!=NULL) {
-    vh=(void **)vp;
-    vp=*vh;
-    free ((void *)vh);
-  }
 }
 
 regchan *getregchan() {
@@ -65,7 +33,7 @@ regchan *getregchan() {
   regchan *rcp;
   
   if (csfreechans==NULL) {
-    csfreechans=(regchan *)csmalloc(ALLOCUNIT*sizeof(regchan));
+    csfreechans=(regchan *)nsmalloc(POOL_CHANSERVDB,ALLOCUNIT*sizeof(regchan));
     for (i=0;i<(ALLOCUNIT-1);i++) {
       csfreechans[i].index=(chanindex *)&(csfreechans[i+1]);
     }
@@ -91,7 +59,7 @@ reguser *getreguser() {
   reguser *rup;
 
   if (csfreeusers==NULL) {
-    csfreeusers=(reguser *)csmalloc(ALLOCUNIT*sizeof(reguser));
+    csfreeusers=(reguser *)nsmalloc(POOL_CHANSERVDB,ALLOCUNIT*sizeof(reguser));
     for (i=0;i<(ALLOCUNIT-1);i++) {
       csfreeusers[i].nextbyname=&(csfreeusers[i+1]);
     }
@@ -117,7 +85,7 @@ regchanuser *getregchanuser() {
   regchanuser *rcup;
 
   if (csfreechanusers==NULL) {
-    csfreechanusers=(regchanuser *)csmalloc(ALLOCUNIT*sizeof(regchanuser));
+    csfreechanusers=(regchanuser *)nsmalloc(POOL_CHANSERVDB,ALLOCUNIT*sizeof(regchanuser));
     for (i=0;i<(ALLOCUNIT-1);i++) {
       csfreechanusers[i].nextbyuser=&(csfreechanusers[i+1]);
     }
@@ -143,7 +111,7 @@ nicklist *getnicklist() {
   nicklist *nlp;
   
   if (csfreenicklists==NULL) {
-    csfreenicklists=(nicklist *)csmalloc(ALLOCUNIT*sizeof(nicklist));
+    csfreenicklists=(nicklist *)nsmalloc(POOL_CHANSERVDB,ALLOCUNIT*sizeof(nicklist));
     for (i=0;i<(ALLOCUNIT-1);i++) {
       csfreenicklists[i].next=&(csfreenicklists[i+1]);
     }
@@ -166,7 +134,7 @@ regban *getregban() {
   regban *rbp;
   
   if (csfreeregbans==NULL) {
-    csfreeregbans=(regban *)csmalloc(ALLOCUNIT*sizeof(regban));
+    csfreeregbans=(regban *)nsmalloc(POOL_CHANSERVDB,ALLOCUNIT*sizeof(regban));
     for (i=0;i<(ALLOCUNIT-1);i++) {
       csfreeregbans[i].next=&(csfreeregbans[i+1]);
     }
@@ -192,7 +160,7 @@ activeuser *getactiveuser() {
   activeuser *aup;
 
   if (csfreeactiveusers==NULL) {
-    csfreeactiveusers=(activeuser *)csmalloc(ALLOCUNIT*sizeof(activeuser));
+    csfreeactiveusers=(activeuser *)nsmalloc(POOL_CHANSERVDB,ALLOCUNIT*sizeof(activeuser));
     for (i=0;i<(ALLOCUNIT-1);i++) {
       csfreeactiveusers[i].next=&(csfreeactiveusers[i+1]);
     }
index 851215b795c4581ea13a9604e19ae135ebef6e4e..845a856b4c62a7d46169733e1457211c2a3d820d 100644 (file)
@@ -5,6 +5,7 @@
 #include "modules.h"
 #include "config.h"
 #include "error.h"
+#include "nsmalloc.h"
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -41,6 +42,9 @@ int main(int argc, char **argv) {
       break;
     }
   }  
+  
+  nsfreeall(POOL_SSTRING);
+  nsexit();
 }
 
 /*
index 770384bc2a4f6871330eb08a048f8ca8d92ec7ac..d7d093e3991a5135b29e872acd7eb7f8c722494e 100644 (file)
@@ -66,3 +66,14 @@ void nsfreeall(unsigned int poolid) {
   pools[poolid]=NULL;
 }
 
+void nsexit() {
+  unsigned int i;
+  
+  for (i=0;i<MAXPOOL;i++) {
+    if (pools[i]) {
+      Error("core",ERR_INFO,"nsmalloc: Blocks still allocated in pool #%d\n",i);
+      nsfreeall(i);
+    }
+  }
+}
+
index 388cce5262f5aae872fdec7fe2bb2f3824ad50a4..29e5df591d0465c39583333f4a67eb54adf493cb 100644 (file)
@@ -5,6 +5,7 @@
 void *nsmalloc(unsigned int poolid, size_t size);
 void nsfree(unsigned int poolid, void *ptr);
 void nsfreeall(unsigned int poolid);
+void nsexit(void);
 
 #define MAXPOOL                100
 
@@ -13,3 +14,6 @@ void nsfreeall(unsigned int poolid);
 #define POOL_CHANINDEX 1
 #define POOL_BANS      2
 #define POOL_CHANNEL   3
+#define POOL_NICK      4
+#define POOL_CHANSERVDB 5
+#define POOL_SSTRING   6
index f77921a7cd9e86176a6e9d207ce4a871a8005121..3acd4d8789e3353d3942bc44735d65c0d3959bb2 100644 (file)
@@ -4,6 +4,7 @@
 #include "sstring.h"
 
 #include "../core/hooks.h"
+#include "../core/nsmalloc.h"
 
 #include <stdio.h>
 
@@ -97,7 +98,7 @@ getstruct:
      
       /* Allocate more RAM */
       allocstruct++;
-      structmem=(sstring *)malloc(SSTRING_STRUCTALLOC);
+      structmem=(sstring *)nsmalloc(POOL_SSTRING,SSTRING_STRUCTALLOC);
       assert(structmem!=NULL);
       structfree=SSTRING_STRUCTALLOC;
     }
@@ -125,7 +126,7 @@ getstruct:
       } else {
         /* Grab some more string space */
         allocstring++;
-        stringmem=(char *)malloc(SSTRING_DATAALLOC);
+        stringmem=(char *)nsmalloc(POOL_SSTRING,SSTRING_DATAALLOC);
         assert(stringmem!=NULL);
         stringfree=SSTRING_DATAALLOC;
       }
index 9b47eef72b5fb199a2b1bda6620317235530945c..12efd036e37f76bd2280688bc6ab34d011a4f754 100644 (file)
@@ -12,6 +12,8 @@
 #include "../server/server.h"
 #include "../parser/parser.h"
 #include "../lib/version.h"
+#include "../core/nsmalloc.h"
+
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
@@ -71,6 +73,24 @@ void _init() {
   iptree = patricia_new_tree(PATRICIA_MAXBITS);
 }
 
+void _fini() {
+  nsfreeall(POOL_NICK);
+  
+  /* Free the hooks */
+  deregisterhook(HOOK_SERVER_NEWSERVER,&handleserverchange);
+  deregisterhook(HOOK_SERVER_LOSTSERVER,&handleserverchange);
+  deregisterhook(HOOK_CORE_STATSREQUEST,&nickstats);
+  
+  /* And our server handlers */
+  deregisterserverhandler("N",&handlenickmsg);
+  deregisterserverhandler("D",&handlekillmsg);
+  deregisterserverhandler("Q",&handlequitmsg);
+  deregisterserverhandler("M",&handleusermodemsg);
+  deregisterserverhandler("W",&handlewhoismsg);
+  deregisterserverhandler("AC",&handleaccountmsg);
+  deregisterserverhandler("R",&handlestatsmsg);  
+}
+
 /*
  * This function handles servers appearing and disappearing.
  *  For a new server, the client table is allocated.
@@ -85,7 +105,7 @@ void handleserverchange(int hooknum, void *arg) {
   
   switch(hooknum) {
     case HOOK_SERVER_NEWSERVER:
-      servernicks[servernum]=(nick **)malloc((serverlist[servernum].maxusernum+1)*sizeof(nick **));
+      servernicks[servernum]=(nick **)nsmalloc(POOL_NICK,(serverlist[servernum].maxusernum+1)*sizeof(nick **));
       memset(servernicks[servernum],0,(serverlist[servernum].maxusernum+1)*sizeof(nick **));
       break;
       
index 1f7031c1712dde97b153ce496bc4840a837162d8..7425f31f1d579e80f4d8d019d3dab3d27ec1151c 100644 (file)
@@ -1,6 +1,8 @@
 /* nick/host/realname/authname allocator */
 
 #include "nick.h"
+#include "../core/nsmalloc.h"
+
 #include <assert.h>
 #include <stdlib.h>
 
@@ -32,7 +34,7 @@ nick *newnick() {
   int i;
   
   if (freenicks==NULL) {
-    freenicks=(nick *)malloc(ALLOCUNIT*sizeof(nick));
+    freenicks=(nick *)nsmalloc(POOL_NICK,ALLOCUNIT*sizeof(nick));
     for (i=0;i<(ALLOCUNIT-1);i++) {
       freenicks[i].next=&(freenicks[i+1]);
     }
@@ -55,7 +57,7 @@ host *newhost() {
   int i;
   
   if (freehosts==NULL) {
-    freehosts=(host *)malloc(ALLOCUNIT*sizeof(host));
+    freehosts=(host *)nsmalloc(POOL_NICK,ALLOCUNIT*sizeof(host));
     for (i=0;i<(ALLOCUNIT-1);i++) {
       freehosts[i].next=&(freehosts[i+1]);
     }