extern int m_umode(aClient *, aClient *, int, char **);
extern int m_names(aClient *, aClient *, int, char **);
-extern void send_umode(aClient *, aClient *, int, int, char *);
+extern void send_umode(aClient *, aClient *, long, long, char *, int);
extern int del_silence(aClient *, char *);
oldumode = acptr->umode;
acptr->umode &= ~UMODE_r;
- send_umode(acptr, acptr, oldumode, ALL_UMODES, mbuf);
+ send_umode(acptr, acptr, oldumode, ALL_UMODES, mbuf, sizeof(mbuf));
}
acptr->tsinfo = atoi(parv[3]);
if (MyClient(acptr) && (oldumode != acptr->umode))
{
char buf[BUFSIZE];
- send_umode(acptr, acptr, oldumode, ALL_UMODES, buf);
+ send_umode(acptr, acptr, oldumode, ALL_UMODES, buf, sizeof(buf));
}
return 0;
}
}
}
- send_umode(NULL, sptr, 0, SEND_UMODES, ubuf);
+ send_umode(NULL, sptr, 0, SEND_UMODES, ubuf, sizeof(ubuf));
if (!*ubuf)
{
ubuf[0] = '+';
memset(sptr->passwd, '\0', PASSWDLEN);
- if (ubuf[1]) send_umode(cptr, sptr, 0, ALL_UMODES, ubuf);
+ if (ubuf[1]) send_umode(cptr, sptr, 0, ALL_UMODES, ubuf, sizeof(ubuf));
if(call_hooks(CHOOK_POSTMOTD, sptr) == FLUSH_BUFFER)
return FLUSH_BUFFER;
if(IsAdmin(sptr))
{
buf2[0]='\0';
- send_umode(NULL, acptr, 0, ALL_UMODES, buf2);
+ send_umode(NULL, acptr, 0, ALL_UMODES, buf2, sizeof(buf2));
if (!*buf2)
{
buf2[0] = '+';
aClient *acptr;
DLink *lp;
- send_umode(NULL, sptr, old, SEND_UMODES, buf);
+ send_umode(NULL, sptr, old, SEND_UMODES, buf, sizeof(buf));
if(*buf)
{
}
if (cptr && MyClient(cptr))
- send_umode(cptr, sptr, old, ALL_UMODES, buf);
+ send_umode(cptr, sptr, old, ALL_UMODES, buf, sizeof(buf));
}
/*
/* send the MODE string for user (user) to connection cptr -avalon */
void
-send_umode(aClient *cptr, aClient *sptr, int old, int sendmask, char *umode_buf)
+send_umode(aClient *cptr, aClient *sptr, long old, long sendmask, char *umode_buf, int bufsize)
{
int *s, flag, what = MODE_NULL;
char *m;
+ int len;
/*
* build a string in umode_buf to represent the change in the user's
*/
m = umode_buf;
*m = '\0';
+ len = 0;
+ bufsize--; /* To have enough space for the null termination char */
for (s = user_modes; (flag = *s); s += 2)
{
if (MyClient(sptr) && !(flag & sendmask))
if ((flag & old) && !(sptr->umode & flag))
{
if (what == MODE_DEL)
+ {
+ if(len+1 > bufsize) break;
*m++ = *(s + 1);
+ len++;
+ }
else
{
+ if(len+2 > bufsize) break;
what = MODE_DEL;
*m++ = '-';
*m++ = *(s + 1);
+ len += 2;
}
}
else if (!(flag & old) && (sptr->umode & flag))
{
if (what == MODE_ADD)
+ {
+ if(len+1 > bufsize) break;
*m++ = *(s + 1);
+ len++;
+ }
else
{
+ if(len+2 > bufsize) break;
what = MODE_ADD;
*m++ = '+';
*m++ = *(s + 1);
+ len += 2;
}
}
}