]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
Stop recreating hashmaps every hour, move garbage collection code related to local...
[user/henk/code/inspircd.git] / src / mode.cpp
index 21c9e7144884d7edb23f403e896d6dda4cc04b36..e2b0c2f6893f5a86dced6da289563c5a5f7e3d19 100644 (file)
@@ -387,7 +387,7 @@ void ModeParser::Process(const std::vector<std::string>& parameters, User *user,
        LastParseParams.clear();
        LastParseTranslate.clear();
 
-       if (!targetchannel && !targetuser)
+       if ((!targetchannel) && ((!targetuser) || (IS_SERVER(targetuser))))
        {
                user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel",user->nick.c_str(),target.c_str());
                return;
@@ -442,7 +442,7 @@ void ModeParser::Process(const std::vector<std::string>& parameters, User *user,
                        continue;
                }
 
-               std::string parameter = "";
+               std::string parameter;
                int pcnt = mh->GetNumParams(adding);
                if (pcnt && param_at == parameters.size())
                {
@@ -675,15 +675,20 @@ bool ModeParser::DelMode(ModeHandler* mh)
        switch (mh->GetModeType())
        {
                case MODETYPE_USER:
-                       for (user_hash::iterator i = ServerInstance->Users->clientlist->begin(); i != ServerInstance->Users->clientlist->end(); i++)
+                       for (user_hash::iterator i = ServerInstance->Users->clientlist->begin(); i != ServerInstance->Users->clientlist->end(); )
                        {
-                               mh->RemoveMode(i->second);
+                               User* user = i->second;
+                               ++i;
+                               mh->RemoveMode(user);
                        }
                break;
                case MODETYPE_CHANNEL:
-                       for (chan_hash::iterator i = ServerInstance->chanlist->begin(); i != ServerInstance->chanlist->end(); i++)
+                       for (chan_hash::iterator i = ServerInstance->chanlist->begin(); i != ServerInstance->chanlist->end(); )
                        {
-                               mh->RemoveMode(i->second);
+                               // The channel may not be in the hash after RemoveMode(), see m_permchannels
+                               Channel* chan = i->second;
+                               ++i;
+                               mh->RemoveMode(chan);
                        }
                break;
        }