1
0
mirror of https://github.com/irssi/irssi.git synced 2024-12-04 14:46:39 -05: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, static void event_mode(IRC_SERVER_REC *server, const char *data,
const char *nick, const char *addr) const char *nick, const char *addr)
{ {
char *params, *channel, *mode; char *params = NULL, *channel = NULL, *mode = NULL;
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);

View File

@ -40,6 +40,8 @@ static int signal_server_incoming;
# define MAX_SOCKET_READS 5 # define MAX_SOCKET_READS 5
#endif #endif
static void strip_params_colon(char *const);
/* The core of the irc_send_cmd* functions. If `raw' is TRUE, the `cmd' /* 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 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! */ line feeds or not. Use with extreme caution! */
@ -269,8 +271,9 @@ char *event_get_params(const char *data, int count, ...)
while (count-- > 0) { while (count-- > 0) {
str = (char **) va_arg(args, char **); str = (char **) va_arg(args, char **);
if (count == 0 && rest) { if (count == 0 && rest) {
/* put the rest to last parameter */ /* Put the rest into the last parameter. */
tmp = *datad == ':' ? datad+1 : datad; strip_params_colon(datad);
tmp = datad;
} else { } else {
tmp = event_get_param(&datad); tmp = event_get_param(&datad);
} }
@ -281,6 +284,31 @@ char *event_get_params(const char *data, int count, ...)
return duprec; 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, static void irc_server_event(IRC_SERVER_REC *server, const char *line,
const char *nick, const char *address) 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, static void event_mode(IRC_SERVER_REC *server, const char *data,
const char *nick) const char *nick)
{ {
IRC_CHANNEL_REC *chanrec; IRC_CHANNEL_REC *chanrec = NULL;
char *params, *channel, *mode; char *params = NULL, *channel = NULL, *mode = NULL;
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);