summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlinuxdaemon <linuxdaemon@users.noreply.github.com>2019-01-30 18:46:13 -0600
committerPatrick <tingping@tingping.se>2019-01-30 19:46:13 -0500
commit804f959a1d0c9bfe88166a7541af4371460b468b (patch)
tree2772bc3c9c1a1f56fa8419434e0b6f280f0197ab
parent7abeb10cf1f82fbad4d167f9e6f6918e1f47650b (diff)
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
-rw-r--r--src/common/modes.c4
-rw-r--r--src/common/proto-irc.c8
-rw-r--r--src/common/proto-irc.h2
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