git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@366
e03df62e-2008-0410-955e-
edbf42e46eb7
#define IDENTMAX 9
#define MAXSOCKS 64
#define IDENTMAX 9
#define MAXSOCKS 64
+#define MAXQUIT 255
+#define MAXCOMMAND 32
+#define MAXTOPIC 307
+#define MAXKICK 255
+
#define DEBUG 10
#define VERBOSE 20
#define DEFAULT 30
#define DEBUG 10
#define VERBOSE 20
#define DEFAULT 30
-Order=7,3,2,6,25,24,-1,1,4,5
+Order=7,3,2,6,25,24,-1,1,4,5,0
Top=0
CursorCol=1
CursorRow=1
Top=0
CursorCol=1
CursorRow=1
-CursorCol=2
-CursorRow=217
-TopLine=190
+CursorCol=1
+CursorRow=231
+TopLine=210
LeftChar=1
[Editor_2]
Open=1
Top=0
LeftChar=1
[Editor_2]
Open=1
Top=0
-CursorCol=33
-CursorRow=83
-TopLine=1
+CursorCol=1
+CursorRow=31
+TopLine=278
Top=0
CursorCol=1
CursorRow=1
Top=0
CursorCol=1
CursorRow=1
-CursorCol=4
-CursorRow=84
+CursorCol=20
+CursorRow=43
void tidystring(char* str)
{
// strips out double spaces before a : parameter
void tidystring(char* str)
{
// strips out double spaces before a : parameter
char temp[MAXBUF];
bool go_again = true;
char temp[MAXBUF];
bool go_again = true;
+ if (!str)
+ {
+ return;
+ }
+
+ while ((str[0] == ' ') && (strlen(str)>0))
+ {
+ str++;
+ }
+
while (go_again)
{
bool noparse = false;
while (go_again)
{
bool noparse = false;
+ if (strlen(str) >= 512)
- str[510] = '\r';
- str[511] = '\n';
- str[512] = '\0';
+ str[509] = '\r';
+ str[510] = '\n';
+ str[511] = '\0';
void Write(int sock,char *text, ...)
{
void Write(int sock,char *text, ...)
{
+ if (!text)
+ {
+ log(DEFAULT,"*** BUG *** Write was given an invalid parameter");
+ return;
+ }
char textbuffer[MAXBUF];
va_list argsPtr;
char tb[MAXBUF];
char textbuffer[MAXBUF];
va_list argsPtr;
char tb[MAXBUF];
void WriteServ(int sock, char* text, ...)
{
void WriteServ(int sock, char* text, ...)
{
+ if (!text)
+ {
+ log(DEFAULT,"*** BUG *** WriteServ was given an invalid parameter");
+ return;
+ }
char textbuffer[MAXBUF],tb[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
char textbuffer[MAXBUF],tb[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
void WriteFrom(int sock, userrec *user,char* text, ...)
{
void WriteFrom(int sock, userrec *user,char* text, ...)
{
+ if ((!text) || (!user))
+ {
+ log(DEFAULT,"*** BUG *** WriteFrom was given an invalid parameter");
+ return;
+ }
char textbuffer[MAXBUF],tb[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
char textbuffer[MAXBUF],tb[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
void WriteTo(userrec *source, userrec *dest,char *data, ...)
{
void WriteTo(userrec *source, userrec *dest,char *data, ...)
{
- char textbuffer[MAXBUF],tb[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, data);
- if ((!dest) || (!source))
+ if ((!source) || (!dest) || (!data))
+ log(DEFAULT,"*** BUG *** WriteTo was given an invalid parameter");
+ char textbuffer[MAXBUF],tb[MAXBUF];
+ va_list argsPtr;
+ va_start (argsPtr, data);
vsnprintf(textbuffer, MAXBUF, data, argsPtr);
va_end(argsPtr);
chop(tb);
vsnprintf(textbuffer, MAXBUF, data, argsPtr);
va_end(argsPtr);
chop(tb);
void WriteChannel(chanrec* Ptr, userrec* user, char* text, ...)
{
void WriteChannel(chanrec* Ptr, userrec* user, char* text, ...)
{
+ if ((!Ptr) || (!user) || (!text))
+ {
+ log(DEFAULT,"*** BUG *** WriteChannel was given an invalid parameter");
+ return;
+ }
char textbuffer[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
char textbuffer[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
void WriteChannelWithServ(char* ServerName, chanrec* Ptr, userrec* user, char* text, ...)
{
void WriteChannelWithServ(char* ServerName, chanrec* Ptr, userrec* user, char* text, ...)
{
+ if ((!Ptr) || (!user) || (!text))
+ {
+ log(DEFAULT,"*** BUG *** WriteChannelWithServ was given an invalid parameter");
+ return;
+ }
char textbuffer[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
char textbuffer[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
va_end(argsPtr);
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
va_end(argsPtr);
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
- if (has_channel(i->second,Ptr))
- WriteServ(i->second->fd,"%s",textbuffer);
+ if (has_channel(i->second,Ptr))
+ {
+ WriteServ(i->second->fd,"%s",textbuffer);
+ }
void ChanExceptSender(chanrec* Ptr, userrec* user, char* text, ...)
{
void ChanExceptSender(chanrec* Ptr, userrec* user, char* text, ...)
{
+ if ((!Ptr) || (!user) || (!text))
+ {
+ log(DEFAULT,"*** BUG *** ChanExceptSender was given an invalid parameter");
+ return;
+ }
char textbuffer[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
char textbuffer[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
- if (has_channel(i->second,Ptr) && (user != i->second))
- WriteTo(user,i->second,"%s",textbuffer);
+ if (has_channel(i->second,Ptr) && (user != i->second))
+ {
+ WriteTo(user,i->second,"%s",textbuffer);
+ }
{
int z = 0;
for (int i =0; i != MAXCHANS; i++)
{
int z = 0;
for (int i =0; i != MAXCHANS; i++)
- if (u->chans[i].channel)
+ if (u->chans[i].channel != NULL)
+ log(DEFAULT,"*** BUG *** common_channels was given an invalid parameter");
return 0;
}
for (i = 0; i != MAXCHANS; i++)
{
for (z = 0; z != MAXCHANS; z++)
{
return 0;
}
for (i = 0; i != MAXCHANS; i++)
{
for (z = 0; z != MAXCHANS; z++)
{
- if ((u->chans[i].channel == u2->chans[z].channel) && (u->chans[i].channel) && (u2->chans[z].channel) && (u->registered == 7) && (u2->registered == 7))
+ if ((u->chans[i].channel != NULL) && (u2->chans[z].channel != NULL))
- if ((c_count(u)) && (c_count(u2)))
+ if ((u->chans[i].channel == u2->chans[z].channel) && (u->chans[i].channel) && (u2->chans[z].channel) && (u->registered == 7) && (u2->registered == 7))
+ if ((c_count(u)) && (c_count(u2)))
+ {
+ return 1;
+ }
void WriteCommon(userrec *u, char* text, ...)
{
void WriteCommon(userrec *u, char* text, ...)
{
+ if (!u)
+ {
+ log(DEFAULT,"*** BUG *** WriteCommon was given an invalid parameter");
+ return;
+ }
+
+ if (u->registered != 7) {
+ log(DEFAULT,"*** BUG *** WriteCommon on an unregistered user");
+ return;
+ }
+
char textbuffer[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
char textbuffer[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
- if (common_channels(u,i->second) && (i->second != u))
- WriteFrom(i->second->fd,u,"%s",textbuffer);
+ if (common_channels(u,i->second) && (i->second != u))
+ {
+ WriteFrom(i->second->fd,u,"%s",textbuffer);
+ }
void WriteCommonExcept(userrec *u, char* text, ...)
{
void WriteCommonExcept(userrec *u, char* text, ...)
{
+ if (!u)
+ {
+ log(DEFAULT,"*** BUG *** WriteCommon was given an invalid parameter");
+ return;
+ }
+
+ if (u->registered != 7) {
+ log(DEFAULT,"*** BUG *** WriteCommon on an unregistered user");
+ return;
+ }
+
char textbuffer[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
char textbuffer[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
- if ((common_channels(u,i->second)) && (u != i->second))
- WriteFrom(i->second->fd,u,"%s",textbuffer);
+ if ((common_channels(u,i->second)) && (u != i->second))
+ {
+ WriteFrom(i->second->fd,u,"%s",textbuffer);
+ }
}
}
}
void WriteOpers(char* text, ...)
{
}
}
}
void WriteOpers(char* text, ...)
{
+ if (!text)
+ {
+ log(DEFAULT,"*** BUG *** WriteOpers was given an invalid parameter");
+ return;
+ }
+
char textbuffer[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
char textbuffer[MAXBUF];
va_list argsPtr;
va_start (argsPtr, text);
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
- if (strchr(i->second->modes,'o'))
- if (strchr(i->second->modes,'s'))
+ if (strchr(i->second->modes,'o'))
- // send server notices to all with +s
- // (TODO: needs SNOMASKs)
- WriteServ(i->second->fd,"NOTICE %s :%s",i->second->nick,textbuffer);
+ if (strchr(i->second->modes,'s'))
+ {
+ // send server notices to all with +s
+ // (TODO: needs SNOMASKs)
+ WriteServ(i->second->fd,"NOTICE %s :%s",i->second->nick,textbuffer);
+ }
void WriteWallOps(userrec *source, char* text, ...)
{
void WriteWallOps(userrec *source, char* text, ...)
{
+ if ((!text) || (!source))
+ {
+ log(DEFAULT,"*** BUG *** WriteOpers was given an invalid parameter");
+ return;
+ }
+
int i = 0;
char textbuffer[MAXBUF];
va_list argsPtr;
int i = 0;
char textbuffer[MAXBUF];
va_list argsPtr;
va_end(argsPtr);
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
va_end(argsPtr);
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
- {
- if (strchr(i->second->modes,'w'))
- {
- WriteTo(source,i->second,"WALLOPS %s",textbuffer);
+ {
+ if (i->second)
+ {
+ if (strchr(i->second->modes,'w'))
+ {
+ WriteTo(source,i->second,"WALLOPS %s",textbuffer);
+ }
{
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
{
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
- if (i->second->fd == fd)
- i->second->bytes_out+=data_out;
- i->second->cmds_out++;
+ if (i->second->fd == fd)
+ {
+ i->second->bytes_out+=data_out;
+ i->second->cmds_out++;
+ }
chanrec* FindChan(const char* chan)
{
chanrec* FindChan(const char* chan)
{
+ if (!chan)
+ {
+ log(DEFAULT,"*** BUG *** Findchan was given an invalid parameter");
+ return NULL;
+ }
+
chan_hash::iterator iter = chanlist.find(chan);
if (iter == chanlist.end())
chan_hash::iterator iter = chanlist.find(chan);
if (iter == chanlist.end())
+ else
+ {
+ log(DEBUG,"skipped purge for %s",i->second->name);
+ }
char* cmode(userrec *user, chanrec *chan)
{
char* cmode(userrec *user, chanrec *chan)
{
+ if ((!user) || (!chan))
+ {
+ log(DEFAULT,"*** BUG *** cmode was given an invalid parameter");
+ return "";
+ }
+
int i;
for (i = 0; i != MAXCHANS; i++)
{
int i;
for (i = 0; i != MAXCHANS; i++)
{
char* chanmodes(chanrec *chan)
{
char* chanmodes(chanrec *chan)
{
+ if (!chan)
+ {
+ log(DEFAULT,"*** BUG *** chanmodes was given an invalid parameter");
+ strcpy(scratch,"");
+ return scratch;
+ }
+
strcpy(scratch,"");
strcpy(sparam,"");
if (chan->noexternal)
strcpy(scratch,"");
strcpy(sparam,"");
if (chan->noexternal)
int cstatus(userrec *user, chanrec *chan)
{
int cstatus(userrec *user, chanrec *chan)
{
+ if ((!chan) || (!user))
+ {
+ log(DEFAULT,"*** BUG *** cstatus was given an invalid parameter");
+ return 0;
+ }
+
int i;
for (i = 0; i != MAXCHANS; i++)
{
int i;
for (i = 0; i != MAXCHANS; i++)
{
void userlist(userrec *user,chanrec *c)
{
void userlist(userrec *user,chanrec *c)
{
+ if ((!c) || (!user))
+ {
+ log(DEFAULT,"*** BUG *** userlist was given an invalid parameter");
+ return;
+ }
+
sprintf(list,"353 %s = %s :", user->nick, c->name);
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
sprintf(list,"353 %s = %s :", user->nick, c->name);
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
{
int i = 0;
int count = 0;
{
int i = 0;
int count = 0;
+
+ if (!c)
+ {
+ log(DEFAULT,"*** BUG *** usercount_i was given an invalid parameter");
+ return 0;
+ }
strcpy(list,"");
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
strcpy(list,"");
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
int i = 0;
int count = 0;
{
int i = 0;
int count = 0;
+
+ if (!c)
+ {
+ log(DEFAULT,"*** BUG *** usercount was given an invalid parameter");
+ return 0;
+ }
strcpy(list,"");
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
strcpy(list,"");
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
chanrec* add_channel(userrec *user, char* cname, char* key)
{
chanrec* add_channel(userrec *user, char* cname, char* key)
{
+
+ if ((!user) || (!cname))
+ {
+ log(DEFAULT,"*** BUG *** add_channel was given an invalid parameter");
+ return 0;
+ }
+
int i = 0;
chanrec* Ptr;
int created = 0;
int i = 0;
chanrec* Ptr;
int created = 0;
chanrec* del_channel(userrec *user, char* cname, char* reason)
{
chanrec* del_channel(userrec *user, char* cname, char* reason)
{
+ if ((!user) || (!cname))
+ {
+ log(DEFAULT,"*** BUG *** del_channel was given an invalid parameter");
+ return NULL;
+ }
+
int i = 0;
chanrec* Ptr;
int created = 0;
int i = 0;
chanrec* Ptr;
int created = 0;
void kick_channel(userrec *src,userrec *user, chanrec *Ptr, char* reason)
{
void kick_channel(userrec *src,userrec *user, chanrec *Ptr, char* reason)
{
+ if ((!src) || (!user) || (!Ptr) || (!reason))
+ {
+ log(DEFAULT,"*** BUG *** kick_channel was given an invalid parameter");
+ return;
+ }
+
int i = 0;
int created = 0;
int i = 0;
int created = 0;
+ log(DEFAULT,"*** BUG *** has_channel was given an invalid parameter");
return 0;
}
for (i =0; i != MAXCHANS; i++)
return 0;
}
for (i =0; i != MAXCHANS; i++)
if ((!user) || (!dest) || (!chan))
{
if ((!user) || (!dest) || (!chan))
{
+ log(DEFAULT,"*** BUG *** give_ops was given an invalid parameter");
return 0;
}
if (status != STATUS_OP)
return 0;
}
if (status != STATUS_OP)
if ((!user) || (!dest) || (!chan))
{
if ((!user) || (!dest) || (!chan))
{
+ log(DEFAULT,"*** BUG *** give_hops was given an invalid parameter");
return 0;
}
if (status != STATUS_OP)
return 0;
}
if (status != STATUS_OP)
if ((!user) || (!dest) || (!chan))
{
if ((!user) || (!dest) || (!chan))
{
+ log(DEFAULT,"*** BUG *** give_voice was given an invalid parameter");
return 0;
}
if (status < STATUS_HOP)
return 0;
}
if (status < STATUS_HOP)
if ((!user) || (!dest) || (!chan))
{
if ((!user) || (!dest) || (!chan))
{
+ log(DEFAULT,"*** BUG *** take_ops was given an invalid parameter");
return 0;
}
if (status != STATUS_OP)
return 0;
}
if (status != STATUS_OP)
if ((!user) || (!dest) || (!chan))
{
if ((!user) || (!dest) || (!chan))
{
+ log(DEFAULT,"*** BUG *** take_hops was given an invalid parameter");
return 0;
}
if (status != STATUS_OP)
return 0;
}
if (status != STATUS_OP)
if ((!user) || (!dest) || (!chan))
{
if ((!user) || (!dest) || (!chan))
{
+ log(DEFAULT,"*** BUG *** take_voice was given an invalid parameter");
return 0;
}
if (status < STATUS_HOP)
return 0;
}
if (status < STATUS_HOP)
void TidyBan(char *ban)
{
void TidyBan(char *ban)
{
+ if (!ban) {
+ log(DEFAULT,"*** BUG *** TidyBan was given an invalid parameter");
+ return;
+ }
+
char temp[MAXBUF],NICK[MAXBUF],IDENT[MAXBUF],HOST[MAXBUF];
strcpy(temp,ban);
char temp[MAXBUF],NICK[MAXBUF],IDENT[MAXBUF],HOST[MAXBUF];
strcpy(temp,ban);
int add_ban(userrec *user,char *dest,chanrec *chan,int status)
{
int add_ban(userrec *user,char *dest,chanrec *chan,int status)
{
+ if ((!user) || (!dest) || (!chan)) {
+ log(DEFAULT,"*** BUG *** add_ban was given an invalid parameter");
+ return 0;
+ }
+
BanItem b;
if ((!user) || (!dest) || (!chan))
return 0;
BanItem b;
if ((!user) || (!dest) || (!chan))
return 0;
int take_ban(userrec *user,char *dest,chanrec *chan,int status)
{
int take_ban(userrec *user,char *dest,chanrec *chan,int status)
{
- if ((!user) || (!dest) || (!chan))
- {
+ if ((!user) || (!dest) || (!chan)) {
+ log(DEFAULT,"*** BUG *** take_ban was given an invalid parameter");
void process_modes(char **parameters,userrec* user,chanrec *chan,int status, int pcnt, bool servermode)
{
void process_modes(char **parameters,userrec* user,chanrec *chan,int status, int pcnt, bool servermode)
{
+ if ((!parameters) || (!user)) {
+ log(DEFAULT,"*** BUG *** process_modes was given an invalid parameter");
+ return;
+ }
+
+
char modelist[MAXBUF];
char outlist[MAXBUF];
char outstr[MAXBUF];
char modelist[MAXBUF];
char outlist[MAXBUF];
char outstr[MAXBUF];
- kick_channel(user,u,Ptr,parameters[2]);
+ char reason[MAXBUF];
+ strncpy(reason,parameters[2],MAXBUF);
+ if (strlen(reason)>MAXKICK)
+ {
+ reason[MAXKICK-1] = '\0';
+ }
+
+ kick_channel(user,u,Ptr,reason);
{
user_hash::iterator iter = clientlist.find(user->nick);
{
user_hash::iterator iter = clientlist.find(user->nick);
+ if (strlen(reason)>MAXQUIT)
+ {
+ reason[MAXQUIT-1] = '\0';
+ }
+
log(DEBUG,"kill_link: %s '%s'",user->nick,reason);
Write(user->fd,"ERROR :Closing link (%s@%s) [%s]",user->ident,user->host,reason);
fdatasync(user->fd);
log(DEBUG,"kill_link: %s '%s'",user->nick,reason);
Write(user->fd,"ERROR :Closing link (%s@%s) [%s]",user->ident,user->host,reason);
fdatasync(user->fd);
clientlist.erase(iter);
}
clientlist.erase(iter);
}
+ if (user->registered == 7) {
+ purge_empty_chans();
+ }
WriteServ(user->fd,"482 %s %s :You must be at least a half-operator", user->nick, Ptr->name);
return;
}
WriteServ(user->fd,"482 %s %s :You must be at least a half-operator", user->nick, Ptr->name);
return;
}
- strcpy(Ptr->topic,parameters[1]);
+
+ char topic[MAXBUF];
+ strncpy(topic,parameters[2],MAXBUF);
+ if (strlen(topic)>MAXTOPIC)
+ {
+ topic[MAXTOPIC-1] = '\0';
+ }
+
+ strcpy(Ptr->topic,topic);
strcpy(Ptr->setby,user->nick);
Ptr->topicset = time(NULL);
WriteChannel(Ptr,user,"TOPIC %s :%s",Ptr->name, Ptr->topic);
strcpy(Ptr->setby,user->nick);
Ptr->topicset = time(NULL);
WriteChannel(Ptr,user,"TOPIC %s :%s",Ptr->name, Ptr->topic);
void handle_quit(char **parameters, int pcnt, userrec *user)
{
user_hash::iterator iter = clientlist.find(user->nick);
void handle_quit(char **parameters, int pcnt, userrec *user)
{
user_hash::iterator iter = clientlist.find(user->nick);
if (user->registered == 7)
{
if (user->registered == 7)
{
+ reason = parameters[0];
+
+ if (strlen(reason)>MAXQUIT)
+ {
+ reason[MAXQUIT-1] = '\0';
+ }
+
Write(user->fd,"ERROR :Closing link (%s@%s) [%s]",user->ident,user->host,parameters[0]);
WriteOpers("*** Client exiting: %s!%s@%s [%s]",user->nick,user->ident,user->host,parameters[0]);
WriteCommonExcept(user,"QUIT :%s%s",PrefixQuit,parameters[0]);
Write(user->fd,"ERROR :Closing link (%s@%s) [%s]",user->ident,user->host,parameters[0]);
WriteOpers("*** Client exiting: %s!%s@%s [%s]",user->nick,user->ident,user->host,parameters[0]);
WriteCommonExcept(user,"QUIT :%s%s",PrefixQuit,parameters[0]);
+ if (strlen(command)>MAXCOMMAND)
+ {
+ command[MAXCOMMAND-1] = '\0';
+ WriteOpers("Possible command-flood from %s, sending excessively long commands.",user->nick);
+ }
+
for (i = 0; i != cmdlist.size(); i++)
{
if (strcmp(cmdlist[i].command,""))
for (i = 0; i != cmdlist.size(); i++)
{
if (strcmp(cmdlist[i].command,""))
void process_buffer(userrec *user)
{
void process_buffer(userrec *user)
{
+ if (!user)
+ {
+ log(DEFAULT,"*** BUG *** process_buffer was given an invalid parameter");
+ return;
+ }
char cmd[MAXBUF];
int i;
if (!user->inbuf)
{
char cmd[MAXBUF];
int i;
if (!user->inbuf)
{
+ log(DEFAULT,"*** BUG *** process_buffer was given an invalid parameter");
return;
}
if (!strcmp(user->inbuf,""))
return;
}
if (!strcmp(user->inbuf,""))
}
log(DEBUG,"InspIRCd: processing: %s %s",user->nick,cmd);
tidystring(cmd);
}
log(DEBUG,"InspIRCd: processing: %s %s",user->nick,cmd);
tidystring(cmd);
- process_command(user,cmd);
+ if (user)
+ {
+ process_command(user,cmd);
+ }
}
void process_restricted_commands(char token,char* params,serverrec* source,serverrec* reply, char* udp_host,int udp_port)
}
void process_restricted_commands(char token,char* params,serverrec* source,serverrec* reply, char* udp_host,int udp_port)
- log(DEBUG,"InspIRCd: Exited: %s",count2->second->nick);
- kill_link(count2->second,"Client exited");
+ if (count2->second)
+ {
+ log(DEBUG,"InspIRCd: Exited: %s",count2->second->nick);
+ kill_link(count2->second,"Client exited");
+ // must bail here? kill_link removes the hash, corrupting the iterator
+ log(DEBUG,"Bailing from client exit");
+ break;
+ }
- strncat(count2->second->inbuf, data, result);
- if (strchr(count2->second->inbuf, '\n') || strchr(count2->second->inbuf, '\r'))
- /* at least one complete line is waiting to be processed */
- if (!count2->second->fd)
- break;
- else
+ strncat(count2->second->inbuf, data, result);
+
+ if (strlen(count2->second->inbuf) > 509) {
+ count2->second->inbuf[509] = '\r';
+ count2->second->inbuf[510] = '\n';
+ count2->second->inbuf[511] = '\0';
+ }
+
+ if (strchr(count2->second->inbuf, '\n') || strchr(count2->second->inbuf, '\r') || (strlen(count2->second->inbuf) > 509))
- process_buffer(count2->second);
- break;
+ /* at least one complete line is waiting to be processed */
+ if (!count2->second->fd)
+ break;
+ else
+ {
+ process_buffer(count2->second);
+ break;
+ }