From: splidge Date: Sat, 2 Jun 2007 16:23:07 +0000 (+0100) Subject: Make valgrind a bit happier. X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/commitdiff_plain/103521a179b174e7aa878e07f4c58f759ac65366 Make valgrind a bit happier. 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. --- diff --git a/chanserv/chanservprivs.c b/chanserv/chanservprivs.c index fbb1b739..3b70fa71 100644 --- a/chanserv/chanservprivs.c +++ b/chanserv/chanservprivs.c @@ -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)); } } diff --git a/chanserv/database/chanservdb.c b/chanserv/database/chanservdb.c index 99d86ada..515e4ed3 100644 --- a/chanserv/database/chanservdb.c +++ b/chanserv/database/chanservdb.c @@ -9,6 +9,7 @@ #include "../../lib/sstring.h" #include "../../parser/parser.h" #include "../../core/events.h" +#include "../../core/nsmalloc.h" #include #include @@ -204,7 +205,7 @@ void _fini() { releaseauthnameext(chanservaext); csdb_freestuff(); - csfreeall(); + nsfreeall(POOL_CHANSERVDB); } void csdb_handlestats(int hooknum, void *arg) { diff --git a/chanserv/database/chanservdb_alloc.c b/chanserv/database/chanservdb_alloc.c index c67223bd..2d7ca658 100644 --- a/chanserv/database/chanservdb_alloc.c +++ b/chanserv/database/chanservdb_alloc.c @@ -4,6 +4,8 @@ */ #include "../chanserv.h" +#include "../../core/nsmalloc.h" + #include #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]); } diff --git a/core/main.c b/core/main.c index 851215b7..845a856b 100644 --- a/core/main.c +++ b/core/main.c @@ -5,6 +5,7 @@ #include "modules.h" #include "config.h" #include "error.h" +#include "nsmalloc.h" #include #include @@ -41,6 +42,9 @@ int main(int argc, char **argv) { break; } } + + nsfreeall(POOL_SSTRING); + nsexit(); } /* diff --git a/core/nsmalloc.c b/core/nsmalloc.c index 770384bc..d7d093e3 100644 --- a/core/nsmalloc.c +++ b/core/nsmalloc.c @@ -66,3 +66,14 @@ void nsfreeall(unsigned int poolid) { pools[poolid]=NULL; } +void nsexit() { + unsigned int i; + + for (i=0;i @@ -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; } diff --git a/nick/nick.c b/nick/nick.c index 9b47eef7..12efd036 100644 --- a/nick/nick.c +++ b/nick/nick.c @@ -12,6 +12,8 @@ #include "../server/server.h" #include "../parser/parser.h" #include "../lib/version.h" +#include "../core/nsmalloc.h" + #include #include #include @@ -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; diff --git a/nick/nickalloc.c b/nick/nickalloc.c index 1f7031c1..7425f31f 100644 --- a/nick/nickalloc.c +++ b/nick/nickalloc.c @@ -1,6 +1,8 @@ /* nick/host/realname/authname allocator */ #include "nick.h" +#include "../core/nsmalloc.h" + #include #include @@ -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]); }