Check for IrcUser's existence in handleMode()
authorManuel Nickschas <sputnick@quassel-irc.org>
Wed, 30 Sep 2009 12:10:31 +0000 (14:10 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 30 Sep 2009 12:11:38 +0000 (14:11 +0200)
src/core/ircserverhandler.cpp

index 6dfb838..5c3fe82 100644 (file)
@@ -265,22 +265,26 @@ void IrcServerHandler::handleMode(const QString &prefix, const QList<QByteArray>
         // user channel modes (op, voice, etc...)
         if(paramOffset < params.count()) {
           IrcUser *ircUser = network()->ircUser(params[paramOffset]);
-          if(add) {
-            bool handledByNetsplit = false;
-            if(!_netsplits.empty()) {
-              foreach(Netsplit* n, _netsplits) {
-                handledByNetsplit = n->userAlreadyJoined(ircUser->hostmask(), channel->name());
-                if(handledByNetsplit) {
-                  n->addMode(ircUser->hostmask(), channel->name(), QString(modes[c]));
-                  break;
+          if(!ircUser) {
+            qWarning() << Q_FUNC_INFO << "Unknown IrcUser:" << params[paramOffset];
+          } else {
+            if(add) {
+              bool handledByNetsplit = false;
+              if(!_netsplits.empty()) {
+                foreach(Netsplit* n, _netsplits) {
+                  handledByNetsplit = n->userAlreadyJoined(ircUser->hostmask(), channel->name());
+                  if(handledByNetsplit) {
+                    n->addMode(ircUser->hostmask(), channel->name(), QString(modes[c]));
+                    break;
+                  }
                 }
               }
+              if(!handledByNetsplit)
+                channel->addUserMode(ircUser, QString(modes[c]));
             }
-            if(!handledByNetsplit)
-              channel->addUserMode(ircUser, QString(modes[c]));
+            else
+              channel->removeUserMode(ircUser, QString(modes[c]));
           }
-          else
-            channel->removeUserMode(ircUser, QString(modes[c]));
         } else {
           qWarning() << "Received MODE with too few parameters:" << serverDecode(params);
         }