From 35a928a3cd87abdc4b92f3a5629a3dd6b82ff465 Mon Sep 17 00:00:00 2001 From: fishwaldo <> Date: Thu, 23 Jan 2003 10:53:38 +0000 Subject: [PATCH] a huge amount of fixes with regards to memory leaks and fixed a bugger of a memleak in connectserv made connectserv support SMODE for ultimate3 now as well --- ChangeLog | 3 + Ultimate.c | 4 +- chans.c | 32 ++++--- dl/cs/cs.c | 206 ++++++++++++++++++++++++++++++----------- dl/cs/cs.h | 15 +-- dl/statserv/database.c | 26 +++--- ircd.c | 20 ++-- stats.h | 16 ++-- users.c | 11 ++- 9 files changed, 222 insertions(+), 111 deletions(-) diff --git a/ChangeLog b/ChangeLog index 434b83ee..2dad3526 100644 --- a/ChangeLog +++ b/ChangeLog @@ -31,6 +31,9 @@ NeoStats ChangeLog - Anything we add/remove/fix/change is in here (even our rant - ultimate3 SMODE support - Ultiamte3 SMODE broke ConnectServ. Bah Humbug - stopped double global messages when a module is loaded/unloaded + - some more memory leaks found with memprof and a 4000 user network!!!! + - Drastically reduced the amount of memory that Neostats now uses. 4000 users used to be around 12Mbs, got it down to 3.6Mbs + - Fixed up connectserv for SMODE support * NeoStats * Shmad & Fish * Version 2.5.0-Release Candidate 2 - Misc. Updates (S) diff --git a/Ultimate.c b/Ultimate.c index da37e64d..09153c22 100644 --- a/Ultimate.c +++ b/Ultimate.c @@ -20,7 +20,7 @@ ** USA ** ** NeoStats CVS Identification -** $Id: Ultimate.c,v 1.35 2003/01/13 07:20:53 fishwaldo Exp $ +** $Id: Ultimate.c,v 1.36 2003/01/23 10:53:38 fishwaldo Exp $ */ #include "stats.h" @@ -369,7 +369,7 @@ int ssvshost_cmd(const char *who, const char *vhost) { log("Can't Find user %s for ssvshost_cmd", who); return 0; } else { - strcpy(u->vhost, vhost); + strncpy(u->vhost, vhost, MAXHOST); #ifdef ULTIMATE3 sts(":%s %s %s %s", me.name, (me.token ? TOK_SETHOST : MSG_SETHOST), who, vhost); #elif ULTIMATE diff --git a/chans.c b/chans.c index 501ca630..16976e47 100644 --- a/chans.c +++ b/chans.c @@ -19,7 +19,7 @@ ** USA ** ** NeoStats CVS Identification -** $Id: chans.c,v 1.39 2003/01/15 14:18:47 fishwaldo Exp $ +** $Id: chans.c,v 1.40 2003/01/23 10:53:38 fishwaldo Exp $ */ #include @@ -58,7 +58,7 @@ extern void Change_Topic(char *owner, Chans *c, time_t time, char *topic) { char **av; int ac = 0; strncpy(c->topic, topic, BUFSIZE); - strncpy(c->topicowner, owner, BUFSIZE); + strncpy(c->topicowner, owner, MAXHOST); c->topictime = time; AddStringToList(&av, c->name, &ac); AddStringToList(&av, owner, &ac); @@ -130,12 +130,12 @@ int ChanMode(char *origin, char **av, int ac) { m = lnode_get(mn); /* mode limit and mode key replace current values */ if ((m->mode == MODE_LIMIT) && (cFlagTab[i].mode == MODE_LIMIT)) { - strcpy(m->param, av[j]); + strncpy(m->param, av[j], PARAMSIZE); j++; modeexists = 1; break; } else if ((m->mode == MODE_KEY) && (cFlagTab[i].mode == MODE_KEY)) { - strcpy(m->param, av[j]); + strncpy(m->param, av[j], PARAMSIZE); j++; modeexists = 1; break; @@ -152,7 +152,7 @@ int ChanMode(char *origin, char **av, int ac) { if (modeexists != 1) { m = smalloc(sizeof(ModesParm)); m->mode = cFlagTab[i].mode; - strcpy(m->param, av[j]); + strncpy(m->param, av[j], PARAMSIZE); mn = lnode_create(m); if (list_isfull(c->modeparms)) { log("Eeek, Can't add additional Modes to Channel %s. Modelist is full", c->name); @@ -253,7 +253,7 @@ Chans *new_chan(char *chan) { strcpy(segv_location, "new_chan"); c = smalloc(sizeof(Chans)); - strcpy(c->name, chan); + strncpy(c->name, chan, CHANLEN); cn = hnode_create(c); if (hash_isfull(ch)) { log("Eeek, Channel Hash is full"); @@ -292,6 +292,7 @@ void del_chan(Chans *c) { } list_destroy_nodes(c->modeparms); list_destroy(c->modeparms); + list_destroy(c->chanmembers); hash_delete(ch, cn); hnode_destroy(cn); free(c); @@ -315,6 +316,7 @@ void part_chan(User *u, char *chan) { Chans *c; lnode_t *un; char **av; + Chanmem *cm; int ac = 0; strcpy(segv_location, "part_chan"); #ifdef DEBUG @@ -343,7 +345,9 @@ void part_chan(User *u, char *chan) { UserDump(u->nick); } } else { + cm = lnode_get(un); lnode_destroy(list_delete(c->chanmembers, un)); + free(cm); AddStringToList(&av, c->name, &ac); AddStringToList(&av, u->nick, &ac); Module_Event("PARTCHAN", av, ac); @@ -411,7 +415,7 @@ void change_user_nick(Chans *c, char *newnick, char *oldnick) { log("Change_User_Nick(): NewNick %s, OldNick %s", newnick, oldnick); #endif cml = lnode_get(cm); - strcpy(cml->nick, newnick); + strncpy(cml->nick, newnick, MAXNICK); } } @@ -469,7 +473,7 @@ void join_chan(User *u, char *chan) { } /* add this users details to the channel members hash */ cm = smalloc(sizeof(Chanmem)); - strcpy(cm->nick, u->nick); + strncpy(cm->nick, u->nick, MAXNICK); cm->joint = time(NULL); cm->flags = 0; cn = lnode_create(cm); @@ -487,6 +491,9 @@ void join_chan(User *u, char *chan) { } if (list_isfull(c->chanmembers)) { log("ekk, Channel %s Members list is full", c->name); + lnode_destroy(cn); + free(cm); + return; } else { list_append(c->chanmembers, cn); } @@ -494,6 +501,7 @@ void join_chan(User *u, char *chan) { un = lnode_create(c->name); if (list_isfull(u->chans)) { log("eek, User %s members list is full", u->nick); + lnode_destroy(un); } else { list_append(u->chans, un); } @@ -542,7 +550,7 @@ void chandump(char *chan) { strcpy(mode, "+"); for (i = 0; i < ((sizeof(cFlagTab) / sizeof(cFlagTab[0])) - 1); i++) { if (c->modes & cFlagTab[i].mode) { - sprintf(mode, "%s%c", mode, cFlagTab[i].flag); + snprintf(mode, 10, "%s%c", mode, cFlagTab[i].flag); } } sendcoders("Channel: %s Members: %d (List %d) Flags %s", c->name, c->cur_users, list_count(c->chanmembers), mode); @@ -564,7 +572,7 @@ void chandump(char *chan) { strcpy(mode, "+"); for (i = 0; i < ((sizeof(cFlagTab) / sizeof(cFlagTab[0])) - 1); i++) { if (cm->flags & cFlagTab[i].mode) { - sprintf(mode, "%s%c", mode, cFlagTab[i].flag); + snprintf(mode, 10, "%s%c", mode, cFlagTab[i].flag); } } sendcoders("Members: %s Modes %s Joined %d", cm->nick, mode, cm->joint); @@ -579,7 +587,7 @@ void chandump(char *chan) { strcpy(mode, "+"); for (i = 0; i < ((sizeof(cFlagTab) / sizeof(cFlagTab[0])) - 1); i++) { if (c->modes & cFlagTab[i].mode) { - sprintf(mode, "%s%c", mode, cFlagTab[i].flag); + snprintf(mode, 10, "%s%c", mode, cFlagTab[i].flag); } } sendcoders("Channel: %s Members: %d (List %d) Flags %s", c->name, c->cur_users, list_count(c->chanmembers), mode); @@ -600,7 +608,7 @@ void chandump(char *chan) { strcpy(mode, "+"); for (i = 0; i < ((sizeof(cFlagTab) / sizeof(cFlagTab[0])) - 1); i++) { if (cm->flags & cFlagTab[i].mode) { - sprintf(mode, "%s%c", mode, cFlagTab[i].flag); + snprintf(mode, 10, "%s%c", mode, cFlagTab[i].flag); } } sendcoders("Members: %s Modes %s Joined: %d", cm->nick, mode, cm->joint); diff --git a/dl/cs/cs.c b/dl/cs/cs.c index 5c75787c..467284a7 100644 --- a/dl/cs/cs.c +++ b/dl/cs/cs.c @@ -20,7 +20,7 @@ ** USA ** ** NeoStats CVS Identification -** $Id: cs.c,v 1.16 2003/01/21 13:15:33 fishwaldo Exp $ +** $Id: cs.c,v 1.17 2003/01/23 10:53:38 fishwaldo Exp $ */ #include @@ -36,6 +36,7 @@ char *s_ConnectServ; extern const char *cs_help[]; int cs_new_user(char **av, int ac); int cs_user_modes(char **av, int ac); +int cs_user_smodes(char **av, int ac); int cs_del_user(char **av, int ac); int cs_user_kill(char **av, int ac); int cs_user_nick(char **av, int ac); @@ -147,7 +148,9 @@ EventFnList my_event_list[] = { { "ONLINE", Online}, { "SIGNON", cs_new_user}, { "UMODE", cs_user_modes}, - { "SMODE", cs_user_modes}, +#ifdef ULTIMATE3 + { "SMODE", cs_user_smodes}, +#endif { "SIGNOFF", cs_del_user}, { "KILL", cs_user_kill}, { "NICK_CHANGE", cs_user_nick}, @@ -237,21 +240,24 @@ int cs_del_user(char **av, int ac) { /* Approximate Segfault Location */ strcpy(segv_location, "cs_del_user"); u = finduser(av[0]); + cmd = sstrdup(recbuf); - lcl = sstrdup(recbuf); + lcl = sstrdup(recbuf); QuitCount = split_buf(cmd, &Quit, 0); - QuitMsg = joinbuf (Quit, QuitCount, 2); + QuitMsg = joinbuf (Quit, QuitCount, 2); /* Local Kill Watch For Signoff */ if (kill_watch) { if (strstr(cmd ,"Local kill by") && strstr(cmd, "[") && strstr(cmd, "]")) { LocalCount = split_buf(lcl, &Local, 0); - KillMsg = joinbuf (Local, LocalCount, 7); - + KillMsg = joinbuf (Local, LocalCount, 7); if (is_synced) chanalert(s_ConnectServ, "\2LOCAL KILL\2 %s (%s@%s) was Killed by %s - Reason sighted: \2%s\2", u->nick, u->username, u->hostname, Local[6], KillMsg); - free(KillMsg); + free(KillMsg); + free(QuitMsg); + free(cmd); + free(lcl); return 1; } @@ -260,10 +266,13 @@ int cs_del_user(char **av, int ac) { /* Print Disconnection Notice */ if (sign_watch) { if (is_synced) chanalert(s_ConnectServ, "\2SIGNOFF\2 %s (%s@%s) has Signed off at %s - %s", u->nick, u->username, u->hostname, u->server->name, QuitMsg); - } - free(QuitMsg); - - return 1; + } + free(QuitMsg); + free(cmd); + free(lcl); + free(Quit); + QuitCount = 0; + return 1; } @@ -291,6 +300,130 @@ int cs_user_modes(char **av, int ac) { case '-': add = 0; break; } + while (*av[1]++) { + switch(*av[1]) { + case '+': add = 1; break; + case '-': add = 0; break; +#ifndef ULTIMATE3 +/* these modes in Ultimate3 are Smodes */ + case NETADMIN_MODE: + if (add) { + if (is_synced) chanalert(s_ConnectServ, "\2NetAdmin\2 %s is Now a Network Administrator", u->nick); + } else { + if (is_synced) chanalert(s_ConnectServ, "\2NetAdmin\2 %s is No Longer a Network Administrator", u->nick); + } + break; + case CONETADMIN_MODE: + if (add) { + if (is_synced) chanalert(s_ConnectServ, "\2Co-NetAdmin\2 %s is Now a Co-Network Administrator", u->nick); + } else { + if (is_synced) chanalert(s_ConnectServ, "\2Co-NetAdmin\2 %s is No Longer a Co-Network Administrator", u->nick); + } + break; + case TECHADMIN_MODE: + if (add) { + if (is_synced) chanalert(s_ConnectServ, "\2TechAdmin\2 %s is Now a Network Technical Administrator", u->nick); + } else { + if (is_synced) chanalert(s_ConnectServ, "\2TechAdmin\2 %s is No Longer a Network Technical Administrator", u->nick); + } + break; + case SERVERADMIN_MODE: + if (add) { + if (is_synced) chanalert(s_ConnectServ, "\2ServerAdmin\2 %s is Now a Server Administrator on %s", u->nick, u->server->name); + } else { + if (is_synced) chanalert(s_ConnectServ, "\2ServerAdmin\2 %s is No Longer a Server Administrator on %s", u->nick, u->server->name); + } + break; + case COSERVERADMIN_MODE: + if (add) { + if (is_synced) chanalert(s_ConnectServ, "\2Co-ServerAdmin\2 %s is Now a Co-Server Administrator on %s", u->nick, u->server->name); + } else { + if (is_synced) chanalert(s_ConnectServ, "\2Co-ServerAdmin\2 %s is No Longer a Co-Server Administrator on %s", u->nick, u->server->name); + } + break; + case GUESTADMIN_MODE: + if (add) { + if (is_synced) chanalert(s_ConnectServ, "\2GuestAdmin\2 %s is Now a Guest Administrator on %s", u->nick, u->server->name); + } else { + if (is_synced) chanalert(s_ConnectServ, "\2GuestAdmin\2 %s is No Longer a Guest Administrator on %s", u->nick, u->server->name); + } + break; +/* these modes are not used in Ultimate3 */ + case BOT_MODE: + if (add) { + if (is_synced) chanalert(s_ConnectServ, "\2Bot\2 %s is Now a Bot", u->nick); + } else { + if (is_synced) chanalert(s_ConnectServ, "\2Bot\2 %s is No Longer a Bot", u->nick); + } + break; + case INVISIBLE_MODE: + if (add) { + globops(s_ConnectServ,"\2%s\2 Is Using \2Invisible Mode\2",u->nick); + } else { + globops(s_ConnectServ,"\2%s\2 Is no longer using \2Invisible Mode\2",u->nick); + } + break; +#endif + case SERVICESADMIN_MODE: + if (add) { + if (is_synced) chanalert(s_ConnectServ, "\2ServicesAdmin\2 %s is Now a Services Administrator", u->nick); + } else { + if (is_synced) chanalert(s_ConnectServ, "\2ServicesAdmin\2 %s is No Longer a Services Administrator", u->nick); + } + break; + case OPER_MODE: + if (add) { + if (is_synced) chanalert(s_ConnectServ, "\2Oper\2 %s is Now a Oper on %s", u->nick, u->server->name); + } else { + if (is_synced) chanalert(s_ConnectServ, "\2Oper\2 %s is No Longer a Oper on %s", u->nick, u->server->name); + } + break; + case LOCOP_MODE: + if (add) { + if (is_synced) chanalert(s_ConnectServ, "\2LocalOper\2 %s is Now a Local Oper on %s", u->nick, u->server->name); + } else { + if (is_synced) chanalert(s_ConnectServ, "\2LocalOper\2 %s is No Longer a Local Oper on %s", u->nick, u->server->name); + } + break; + case NETSERVICE_MODE: + if (add) { + if (is_synced) chanalert(s_ConnectServ, "\2Services\2 %s is Now a Network Service", u->nick); + } else { + if (is_synced) chanalert(s_ConnectServ, "\2Services\2 %s is No Longer a Network Service", u->nick); + } + break; + default: + break; + } + } + return 1; +} + +#ifdef ULTIMATE3 +/* smode support for Ultimate3 */ +int cs_user_smodes(char **av, int ac) { + int add = 1; + char *modes; + User *u; + + /* Approximate Segfault Location */ + strcpy(segv_location, "cs_user_modes"); + + if (mode_watch != 1) return -1; + + u = finduser(av[0]); + if (!u) { + cslog("Changing modes for unknown user: %s", u->nick); + return -1; + } + + if (!u->modes) return -1; + modes = u->modes; + switch (*av[1]) { + case '+': add = 1; break; + case '-': add = 0; break; + } + while (*av[1]++) { switch(*av[1]) { case '+': add = 1; break; @@ -309,13 +442,6 @@ int cs_user_modes(char **av, int ac) { if (is_synced) chanalert(s_ConnectServ, "\2Co-NetAdmin\2 %s is No Longer a Co-Network Administrator", u->nick); } break; - case NETSERVICE_MODE: - if (add) { - if (is_synced) chanalert(s_ConnectServ, "\2Services\2 %s is Now a Network Service", u->nick); - } else { - if (is_synced) chanalert(s_ConnectServ, "\2Services\2 %s is No Longer a Network Service", u->nick); - } - break; case TECHADMIN_MODE: if (add) { if (is_synced) chanalert(s_ConnectServ, "\2TechAdmin\2 %s is Now a Network Technical Administrator", u->nick); @@ -323,6 +449,13 @@ int cs_user_modes(char **av, int ac) { if (is_synced) chanalert(s_ConnectServ, "\2TechAdmin\2 %s is No Longer a Network Technical Administrator", u->nick); } break; + case COTECHADMIN_MODE: + if (add) { + if (is_synced) chanalert(s_ConnectServ, "\2Co-TechAdmin\2 %s is Now a Network Co-Technical Administrator", u->nick); + } else { + if (is_synced) chanalert(s_ConnectServ, "\2Co-TechAdmin\2 %s is No Longer a Network Co-Technical Administrator", u->nick); + } + break; case SERVERADMIN_MODE: if (add) { if (is_synced) chanalert(s_ConnectServ, "\2ServerAdmin\2 %s is Now a Server Administrator on %s", u->nick, u->server->name); @@ -330,13 +463,6 @@ int cs_user_modes(char **av, int ac) { if (is_synced) chanalert(s_ConnectServ, "\2ServerAdmin\2 %s is No Longer a Server Administrator on %s", u->nick, u->server->name); } break; - case SERVICESADMIN_MODE: - if (add) { - if (is_synced) chanalert(s_ConnectServ, "\2ServicesAdmin\2 %s is Now a Services Administrator", u->nick); - } else { - if (is_synced) chanalert(s_ConnectServ, "\2ServicesAdmin\2 %s is No Longer a Services Administrator", u->nick); - } - break; case COSERVERADMIN_MODE: if (add) { if (is_synced) chanalert(s_ConnectServ, "\2Co-ServerAdmin\2 %s is Now a Co-Server Administrator on %s", u->nick, u->server->name); @@ -351,41 +477,13 @@ int cs_user_modes(char **av, int ac) { if (is_synced) chanalert(s_ConnectServ, "\2GuestAdmin\2 %s is No Longer a Guest Administrator on %s", u->nick, u->server->name); } break; - case BOT_MODE: - if (add) { - if (is_synced) chanalert(s_ConnectServ, "\2Bot\2 %s is Now a Bot", u->nick); - } else { - if (is_synced) chanalert(s_ConnectServ, "\2Bot\2 %s is No Longer a Bot", u->nick); - } - break; - case INVISIBLE_MODE: - if (add) { - globops(s_ConnectServ,"\2%s\2 Is Using \2Invisible Mode\2",u->nick); - } else { - globops(s_ConnectServ,"\2%s\2 Is no longer using \2Invisible Mode\2",u->nick); - } - break; - case OPER_MODE: - if (add) { - if (is_synced) chanalert(s_ConnectServ, "\2Oper\2 %s is Now a Oper on %s", u->nick, u->server->name); - } else { - if (is_synced) chanalert(s_ConnectServ, "\2Oper\2 %s is No Longer a Oper on %s", u->nick, u->server->name); - } - break; - case LOCOP_MODE: - if (add) { - if (is_synced) chanalert(s_ConnectServ, "\2LocalOper\2 %s is Now a Local Oper on %s", u->nick, u->server->name); - } else { - if (is_synced) chanalert(s_ConnectServ, "\2LocalOper\2 %s is No Longer a Local Oper on %s", u->nick, u->server->name); - } - break; default: break; } } return 1; } - +#endif /* Routine for KILL message to be echoed */ int cs_user_kill(char **av, int ac) { diff --git a/dl/cs/cs.h b/dl/cs/cs.h index e7196c26..e7d033b4 100644 --- a/dl/cs/cs.h +++ b/dl/cs/cs.h @@ -20,7 +20,7 @@ ** USA ** ** NeoStats CVS Identification -** $Id: cs.h,v 1.7 2003/01/13 07:20:53 fishwaldo Exp $ +** $Id: cs.h,v 1.8 2003/01/23 10:53:38 fishwaldo Exp $ */ @@ -30,13 +30,14 @@ #ifdef ULTIMATE3 #define LOCOP_MODE 'O' #define OPER_MODE 'o' - #define GUESTADMIN_MODE 'j' - #define COSERVERADMIN_MODE 'J' + #define GUESTADMIN_MODE 'G' + #define COSERVERADMIN_MODE 'a' #define SERVERADMIN_MODE 'A' - #define CONETADMIN_MODE 't' - #define NETADMIN_MODE 'T' - #define TECHADMIN_MODE '7' /* Set to a number as we dont use */ - #define SERVICESADMIN_MODE 'P' + #define CONETADMIN_MODE 'n' + #define NETADMIN_MODE 'N' + #define COTECHADMIN_MODE 't' + #define TECHADMIN_MODE 'T' /* Set to a number as we dont use */ + #define SERVICESADMIN_MODE 'a' #define NETSERVICE_MODE 'S' #define INVISIBLE_MODE '8' /* Set to a number as we dont use */ #define BOT_MODE '9' /* Set to a number as we dont use */ diff --git a/dl/statserv/database.c b/dl/statserv/database.c index 18ac4a46..c37e01eb 100644 --- a/dl/statserv/database.c +++ b/dl/statserv/database.c @@ -22,7 +22,7 @@ ** USA ** ** NeoStats CVS Identification -** $Id: database.c,v 1.11 2003/01/22 16:36:58 fishwaldo Exp $ +** $Id: database.c,v 1.12 2003/01/23 10:53:38 fishwaldo Exp $ */ @@ -230,21 +230,19 @@ void LoadStats() lnode_destroy(cn); free(c); } -#if 0 - free(name); - free(topics); - free(totmem); - free(kicks); - free(lastseen); - free(maxmems); - free(t_maxmems); - free(maxkicks); - free(t_maxkicks); - free(maxjoins); - free(t_maxjoins); -#endif } } + free(name); + free(topics); + free(totmem); + free(kicks); + free(lastseen); + free(maxmems); + free(t_maxmems); + free(maxkicks); + free(t_maxkicks); + free(maxjoins); + free(t_maxjoins); fclose(fp); diff --git a/ircd.c b/ircd.c index 431e002a..fd1ac483 100755 --- a/ircd.c +++ b/ircd.c @@ -22,7 +22,7 @@ ** USA ** ** NeoStats CVS Identification -** $Id: ircd.c,v 1.108 2003/01/21 13:09:23 fishwaldo Exp $ +** $Id: ircd.c,v 1.109 2003/01/23 10:53:38 fishwaldo Exp $ */ #include @@ -477,7 +477,7 @@ void parse(char *line) strcpy(segv_location, "parse"); strip(line); - strcpy(recbuf, line); + strncpy(recbuf, line, BUFSIZE); if (!(*line)) return; #ifdef DEBUG @@ -728,7 +728,7 @@ void Srv_Sjoin(char *origin, char **argv, int argc) { if (cFlagTab[i].parameters) { m = smalloc(sizeof(ModesParm)); m->mode = cFlagTab[i].mode; - strcpy(m->param, argv[j]); + strncpy(m->param, argv[j], PARAMSIZE); mn = lnode_create(m); if (!list_isfull(tl)) { list_append(tl, mn); @@ -775,7 +775,7 @@ void Srv_Sjoin(char *origin, char **argv, int argc) { mode |= MODE_VOICE; modes++; } else { - strcpy(nick, modes); + strncpy(nick, modes, MAXNICK); ok = 0; break; } @@ -997,9 +997,9 @@ void Usr_Vhost(char *origin, char **argv, int argc) { #endif if (u) { #ifndef ULTIMATE3 - strcpy(u->vhost, argv[0]); + strncpy(u->vhost, argv[0], MAXHOST); #else - strcpy(u->vhost, argv[1]); + strncpy(u->vhost, argv[1], MAXHOST); #endif } } @@ -1111,7 +1111,7 @@ void Srv_Vctrl(char *origin, char **argv, int argc) { ircd_srv.nicklg = atoi(argv[1]); ircd_srv.modex = atoi(argv[2]); ircd_srv.gc = atoi(argv[3]); - strcpy(me.netname, argv[14]); + strncpy(me.netname, argv[14], MAXPASS); vctrl_cmd(); } #endif @@ -1124,8 +1124,8 @@ void Srv_Svinfo(char *origin, char **argv, int argc) { void Srv_Netinfo(char *origin, char **argv, int argc) { me.onchan = 1; ircd_srv.uprot = atoi(argv[2]); - strcpy(ircd_srv.cloak, argv[3]); - strcpy(me.netname, argv[7]); + strncpy(ircd_srv.cloak, argv[3], 10); + strncpy(me.netname, argv[7], MAXPASS); #if !defined(HYBRID7) && !defined(NEOIRCD) snetinfo_cmd(); @@ -1216,7 +1216,7 @@ void Srv_Nick(char *origin, char **argv, int argc) { Module_Event("SIGNON", av, ac); u = finduser(argv[0]); if (u) { - strcpy(u->vhost, argv[6]); + strncpy(u->vhost, argv[6], MAXHOST); } #ifdef DEBUG log("Mode: UserMode: %s",argv[3]); diff --git a/stats.h b/stats.h index 466ea213..9b2b3325 100644 --- a/stats.h +++ b/stats.h @@ -20,7 +20,7 @@ ** USA ** ** NeoStats CVS Identification -** $Id: stats.h,v 1.67 2003/01/22 16:37:38 fishwaldo Exp $ +** $Id: stats.h,v 1.68 2003/01/23 10:53:38 fishwaldo Exp $ */ #ifndef STATS_H @@ -77,6 +77,8 @@ #define MAXPASS 32 #define MAXNICK 32 #define MAXUSER 10 +#define MODESIZE 53 +#define PARAMSIZE MAXNICK+MAXUSER+MAXHOST+10 #define NUM_MODULES 255 @@ -184,16 +186,16 @@ struct server_ { struct user_ { char nick[MAXNICK]; - char hostname[BUFSIZE]; - char username[BUFSIZE]; - char vhost[BUFSIZE]; + char hostname[MAXHOST]; + char username[MAXUSER]; + char vhost[MAXHOST]; Server *server; MyUser *myuser; int flood; int is_away; time_t t_flood; long hash; - char modes[BUFSIZE]; + char modes[MODESIZE]; int ulevel; long Umode; list_t *chans; @@ -211,7 +213,7 @@ struct chans_ { list_t *chanmembers; list_t *modeparms; char topic[BUFSIZE]; - char topicowner[BUFSIZE]; + char topicowner[MAXHOST]; /* becuase a "server" can be a topic owner */ time_t topictime; } chans_; @@ -223,7 +225,7 @@ struct chanmem_ { struct modeparms_ { long mode; - char param[512]; + char param[PARAMSIZE]; } modeparms_; diff --git a/users.c b/users.c index 54980647..5d59ce87 100755 --- a/users.c +++ b/users.c @@ -22,7 +22,7 @@ ** USA ** ** NeoStats CVS Identification -** $Id: users.c,v 1.41 2003/01/06 12:07:25 fishwaldo Exp $ +** $Id: users.c,v 1.42 2003/01/23 10:53:38 fishwaldo Exp $ */ #include @@ -85,8 +85,8 @@ void AddUser(const char *nick, const char *user, const char *host, const char *s } u = new_user(nick); - strcpy(u->hostname,host); - strcpy(u->username, user); + strncpy(u->hostname,host, MAXHOST); + strncpy(u->username, user, MAXUSER); u->server = findserver(server); u->t_flood = time(NULL); u->flood = 0; @@ -126,6 +126,7 @@ void DelUser(const char *nick) hash_delete(uh, un); hnode_destroy(un); + list_destroy(u->chans); free(u); } @@ -149,7 +150,7 @@ void Change_User(User *u, const char *newnick) } strcpy(segv_location, "Change_User_Return"); hash_delete(uh, un); - strcpy(u->nick, newnick); + strncpy(u->nick, newnick, MAXNICK); hash_insert(uh, un, u->nick); } @@ -313,7 +314,7 @@ void UserMode(const char *nick, const char *modes) #endif log("Modes: %s", modes); #endif - strcpy(u->modes, modes); + strncpy(u->modes, modes, MODESIZE); tmpmode = *(modes); while (tmpmode) { switch(tmpmode) {