From 3588c519c3d3766488ae952a35e5376e675b52ba Mon Sep 17 00:00:00 2001 From: linuxdaemon Date: Wed, 30 Jan 2019 18:46:13 -0600 Subject: [PATCH] Remove : from various trailing parameters (#2301) Partial fix for #2271 This isn't an exhaustive list, but it's everything I could find. The bug still exists in the parser though, this is just a workaround for the moment --- src/common/modes.c | 4 +++- src/common/proto-irc.c | 8 ++++---- src/common/proto-irc.h | 2 ++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/common/modes.c b/src/common/modes.c index c65bf279..3c0ac8ab 100644 --- a/src/common/modes.c +++ b/src/common/modes.c @@ -735,6 +735,8 @@ handle_mode (server * serv, char *word[], char *word_eol[], if (!(*word[i + offset])) break; num_args++; + if (word[i + offset][0] == ':') + break; } /* count the number of modes (without the -/+ chars */ @@ -765,7 +767,7 @@ handle_mode (server * serv, char *word[], char *word_eol[], if ((all_modes_have_args || mode_has_arg (serv, sign, *modes)) && arg < (num_args + 1)) { arg++; - argstr = word[arg + offset]; + argstr = STRIP_COLON(word, word_eol, arg+offset); } handle_single_mode (&mr, sign, *modes, nick, chan, argstr, numeric_324 || prefs.hex_irc_raw_modes, diff --git a/src/common/proto-irc.c b/src/common/proto-irc.c index 776d1434..497cb6ca 100644 --- a/src/common/proto-irc.c +++ b/src/common/proto-irc.c @@ -714,7 +714,7 @@ process_numeric (session * sess, int n, break; case 333: - inbound_topictime (serv, word[4], word[5], atol (word[6]), tags_data); + inbound_topictime (serv, word[4], word[5], atol (STRIP_COLON(word, word_eol, 6)), tags_data); break; #if 0 @@ -726,7 +726,7 @@ process_numeric (session * sess, int n, #endif case 341: /* INVITE ACK */ - EMIT_SIGNAL_TIMESTAMP (XP_TE_UINVITE, sess, word[4], word[5], + EMIT_SIGNAL_TIMESTAMP (XP_TE_UINVITE, sess, word[4], STRIP_COLON(word, word_eol, 5), serv->servername, NULL, 0, tags_data->timestamp); break; @@ -1142,7 +1142,7 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[], { case WORDL('A','C','C','O'): - inbound_account (serv, nick, word[3], tags_data); + inbound_account (serv, nick, STRIP_COLON(word, word_eol, 3), tags_data); return; case WORDL('A', 'U', 'T', 'H'): @@ -1150,7 +1150,7 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[], return; case WORDL('C', 'H', 'G', 'H'): - inbound_user_info (sess, NULL, word[3], word[4], NULL, nick, NULL, + inbound_user_info (sess, NULL, word[3], STRIP_COLON(word, word_eol, 4), NULL, nick, NULL, NULL, 0xff, tags_data); return; diff --git a/src/common/proto-irc.h b/src/common/proto-irc.h index a7b4029c..6c075795 100644 --- a/src/common/proto-irc.h +++ b/src/common/proto-irc.h @@ -28,6 +28,8 @@ (time_t)0, /* timestamp */ \ } +#define STRIP_COLON(word, word_eol, idx) (word)[(idx)][0] == ':' ? (word_eol)[(idx)]+1 : (word)[(idx)] + /* Message tag information that might be passed along with a server message * * See http://ircv3.atheme.org/specification/capability-negotiation-3.1