From 815f878218872c630f0b054aee40f524cad8f1a8 Mon Sep 17 00:00:00 2001 From: Shane Synan Date: Wed, 29 Jun 2016 17:16:42 -0400 Subject: [PATCH] Handle non-standard missing event parameters Improve 'IrcEventAway', 'IrcEvent330', and 'IrcEvent403' to be more resilient to missing parameters. We don't need all of the parameters to get the needed information. These event handlers were introduced as part of the IRCv3 changes and shouldn't modify how 0.12.4 handled commands. --- src/core/coresessioneventprocessor.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/core/coresessioneventprocessor.cpp b/src/core/coresessioneventprocessor.cpp index c7a5b5b6..a89020c0 100644 --- a/src/core/coresessioneventprocessor.cpp +++ b/src/core/coresessioneventprocessor.cpp @@ -253,13 +253,17 @@ void CoreSessionEventProcessor::processIrcEventAccount(IrcEvent *e) /* IRCv3 away-notify - ":nick!user@host AWAY [:message]" */ void CoreSessionEventProcessor::processIrcEventAway(IrcEvent *e) { - if (!checkParamCount(e, 2)) + if (!checkParamCount(e, 1)) return; + // Don't use checkParamCount(e, 2) since the message is optional. Some servers respond in a way + // that it counts as two parameters, but we shouldn't rely on that. // Nick is sent as part of parameters in order to split user/server decoding IrcUser *ircuser = e->network()->ircUser(e->params().at(0)); if (ircuser) { - if (!e->params().at(1).isEmpty()) { + // If two parameters are sent -and- the second parameter isn't empty, then user is away. + // Otherwise, mark them as not away. + if (e->params().count() >= 2 && !e->params().at(1).isEmpty()) { ircuser->setAway(true); ircuser->setAwayMessage(e->params().at(1)); } else { @@ -881,7 +885,9 @@ void CoreSessionEventProcessor::processIrcEvent324(IrcEvent *e) /* RPL_WHOISACCOUNT - " :is authed as" */ void CoreSessionEventProcessor::processIrcEvent330(IrcEvent *e) { - if (!checkParamCount(e, 3)) + // Though the ":is authed as" remark should always be there, we should handle cases when it's + // not included, too. + if (!checkParamCount(e, 2)) return; IrcUser *ircuser = e->network()->ircUser(e->params().at(0)); @@ -1100,7 +1106,9 @@ void CoreSessionEventProcessor::processWhoInformation (Network *net, const QStri void CoreSessionEventProcessor::processIrcEvent403(IrcEventNumeric *e) { // If this is the result of an AutoWho, hide it. It's confusing to show to the user. - if (!checkParamCount(e, 2)) + // Though the ":No such channel" remark should always be there, we should handle cases when it's + // not included, too. + if (!checkParamCount(e, 1)) return; QString channelOrNick = e->params()[0]; -- 2.20.1