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
This commit is contained in:
linuxdaemon 2019-01-30 18:46:13 -06:00 committed by Patrick Griffis
parent ce528b6af8
commit 3588c519c3
3 changed files with 9 additions and 5 deletions

View File

@ -735,6 +735,8 @@ handle_mode (server * serv, char *word[], char *word_eol[],
if (!(*word[i + offset])) if (!(*word[i + offset]))
break; break;
num_args++; num_args++;
if (word[i + offset][0] == ':')
break;
} }
/* count the number of modes (without the -/+ chars */ /* 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)) if ((all_modes_have_args || mode_has_arg (serv, sign, *modes)) && arg < (num_args + 1))
{ {
arg++; arg++;
argstr = word[arg + offset]; argstr = STRIP_COLON(word, word_eol, arg+offset);
} }
handle_single_mode (&mr, sign, *modes, nick, chan, handle_single_mode (&mr, sign, *modes, nick, chan,
argstr, numeric_324 || prefs.hex_irc_raw_modes, argstr, numeric_324 || prefs.hex_irc_raw_modes,

View File

@ -714,7 +714,7 @@ process_numeric (session * sess, int n,
break; break;
case 333: 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; break;
#if 0 #if 0
@ -726,7 +726,7 @@ process_numeric (session * sess, int n,
#endif #endif
case 341: /* INVITE ACK */ 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); serv->servername, NULL, 0, tags_data->timestamp);
break; break;
@ -1142,7 +1142,7 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
{ {
case WORDL('A','C','C','O'): 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; return;
case WORDL('A', 'U', 'T', 'H'): case WORDL('A', 'U', 'T', 'H'):
@ -1150,7 +1150,7 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
return; return;
case WORDL('C', 'H', 'G', 'H'): 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); NULL, 0xff, tags_data);
return; return;

View File

@ -28,6 +28,8 @@
(time_t)0, /* timestamp */ \ (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 /* Message tag information that might be passed along with a server message
* *
* See http://ircv3.atheme.org/specification/capability-negotiation-3.1 * See http://ircv3.atheme.org/specification/capability-negotiation-3.1