]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/cull_list.cpp
Fix crash when services (or a misbehaving remote server) introduces a server with...
[user/henk/code/inspircd.git] / src / cull_list.cpp
index 9d8bb3bae75f91db47fd32651dc7229ff6686390..abefa8b5750fc8ec059aefd552597936acba40cf 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
+ *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
  * See: http://www.inspircd.org/wiki/index.php/Credits
  *
  * This program is free but copyrighted software; see
@@ -11,7 +11,7 @@
  * ---------------------------------------------------
  */
 
-/* $Core: libIRCDcull_list */
+/* $Core */
 
 #include "inspircd.h"
 #include "cull_list.h"
@@ -23,13 +23,6 @@ CullList::CullList(InspIRCd* Instance) : ServerInstance(Instance)
 
 void CullList::AddItem(User* user)
 {
-       if (user->quitting)
-       {
-               ServerInstance->Logs->Log("CULLLIST",DEBUG, "*** Warning *** - You tried to quit a user (%s) twice. Did your module call QuitUser twice?", user->nick.c_str());
-               return;
-       }
-
-       user->quitting = true;
        list.push_back(user);
 }
 
@@ -54,8 +47,8 @@ int CullList::Apply()
                std::string reason;
                std::string oper_reason;
 
-               reason.assign(u->quitmsg, 0, MAXQUIT - 1);
-               oper_reason.assign(preset_reason.empty() ? preset_reason : u->operquitmsg, 0, MAXQUIT - 1);
+               reason.assign(u->quitmsg, 0, ServerInstance->Config->Limits.MaxQuit);
+               oper_reason.assign(preset_reason.empty() ? preset_reason : u->operquitmsg, 0, ServerInstance->Config->Limits.MaxQuit);
 
                if (u->registered != REG_ALL)
                        if (ServerInstance->Users->unregistered_count)
@@ -63,7 +56,7 @@ int CullList::Apply()
 
                if (IS_LOCAL(u))
                {
-                       if ((!u->sendq.empty()) && (!(*u->GetWriteError())))
+                       if (!u->sendq.empty())
                                u->FlushWriteBuf();
                }
 
@@ -78,11 +71,11 @@ int CullList::Apply()
 
                if (IS_LOCAL(u))
                {
-                       if (u->io)
+                       if (u->GetIOHook())
                        {
                                try
                                {
-                                       u->io->OnRawSocketClose(u->GetFd());
+                                       u->GetIOHook()->OnRawSocketClose(u->GetFd());
                                }
                                catch (CoreException& modexcept)
                                {
@@ -117,20 +110,13 @@ int CullList::Apply()
                        u->AddToWhoWas();
                }
 
-               bool deleteu = true;
-
                if (iter != ServerInstance->Users->clientlist->end())
                {
                        ServerInstance->Users->clientlist->erase(iter);
                }
                else
                {
-                       /*
-                        * Trying to track down Jason's issue.. this should never happen obviously.
-                        */
-                       ServerInstance->Logs->Log("CULLLIST", DEBUG, "iter == clientlist->end, can't remove them from hash... problematic?");
-//                     deleteu = false;
-// actually, delete them anyway.. the local vector is the real problem here
+                       ServerInstance->Logs->Log("CULLLIST", DEBUG, "iter == clientlist->end, can't remove them from hash... problematic..");
                }
 
                if (IS_LOCAL(u))
@@ -140,22 +126,11 @@ int CullList::Apply()
                                ServerInstance->Users->local_users.erase(x);
                        else
                        {
-                               /*
-                                * This code is in here to monitor an issue of Jason's, where it seems to be trying to quit already quit users.
-                                * The only way that can happen is if this find fails, so log it just in case.
-                                * Also, (perhaps incorrectly, but oh well), return here so we don't delete the user and then start trampling
-                                * on deleted memory, which leads to big problems..
-                                */
-                               ServerInstance->Logs->Log("CULLLIST", DEBUG, "Failed to remove user from vector, we're all gonna die!!! Not deleting the user to save our sanity");
-                               deleteu = false;
+                               ServerInstance->Logs->Log("CULLLIST", DEBUG, "Failed to remove user from vector..");
                        }
                }
 
-               if (deleteu)
-               {
-                       delete u;
-               }
-
+               delete u;
                list.erase(list.begin());
        }