1
0
mirror of https://github.com/irssi/irssi.git synced 2024-06-30 06:45:25 +00:00

Strip : from <trailing> parameters

This is to fix #601. The function used to extract the mode string
assumed that ":" would only occur in a particular spot. This lead to the
possibility that ":" could be treated as part of things like nicknames
or mode arguments, where it should have been stripped as part of
protocol escaping.
This commit is contained in:
Will Storey 2017-10-21 20:00:25 -07:00
parent cfa51c5ae2
commit 8843d4f77d
3 changed files with 33 additions and 5 deletions

View File

@ -224,7 +224,7 @@ static void event_nick(IRC_SERVER_REC *server, const char *data,
static void event_mode(IRC_SERVER_REC *server, const char *data,
const char *nick, const char *addr)
{
char *params, *channel, *mode;
char *params = NULL, *channel = NULL, *mode = NULL;
g_return_if_fail(data != NULL);

View File

@ -40,6 +40,8 @@ static int signal_server_incoming;
# define MAX_SOCKET_READS 5
#endif
static void strip_params_colon(char *const);
/* The core of the irc_send_cmd* functions. If `raw' is TRUE, the `cmd'
won't be checked at all if it's 512 bytes or not, or if it contains
line feeds or not. Use with extreme caution! */
@ -269,8 +271,9 @@ char *event_get_params(const char *data, int count, ...)
while (count-- > 0) {
str = (char **) va_arg(args, char **);
if (count == 0 && rest) {
/* put the rest to last parameter */
tmp = *datad == ':' ? datad+1 : datad;
/* Put the rest into the last parameter. */
strip_params_colon(datad);
tmp = datad;
} else {
tmp = event_get_param(&datad);
}
@ -281,6 +284,31 @@ char *event_get_params(const char *data, int count, ...)
return duprec;
}
/* Given a string containing <params>, strip any colon prefixing <trailing>. */
static void strip_params_colon(char *const params)
{
if (!params) {
return;
}
char *s = params;
while (*s != '\0') {
if (*s == ':') {
memmove(s, s+1, strlen(s+1)+1);
return;
}
s = strchr(s, ' ');
if (!s) {
return;
}
while (*s == ' ') {
s++;
}
}
}
static void irc_server_event(IRC_SERVER_REC *server, const char *line,
const char *nick, const char *address)
{

View File

@ -480,8 +480,8 @@ static void event_user_mode(IRC_SERVER_REC *server, const char *data)
static void event_mode(IRC_SERVER_REC *server, const char *data,
const char *nick)
{
IRC_CHANNEL_REC *chanrec;
char *params, *channel, *mode;
IRC_CHANNEL_REC *chanrec = NULL;
char *params = NULL, *channel = NULL, *mode = NULL;
g_return_if_fail(data != NULL);