summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2008-05-19 10:27:34 +0000
committerw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2008-05-19 10:27:34 +0000
commit110d053f8c7cf704a2ef642cb092ed76a8d54b0d (patch)
treefa6f2ae1052b321ba042433303a254128ab12e49
parent2df1a3de458cbc1727f35dbe8b0bb949d2485db8 (diff)
Some logging/preventative code for Jason's issue.. it shouldn't crash now (fingers crossed) if it tries to do something naughty, but it will log about it instead. I know this is buttfucked code, but it's highly temporary.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@9762 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--src/cull_list.cpp39
1 files changed, 33 insertions, 6 deletions
diff --git a/src/cull_list.cpp b/src/cull_list.cpp
index 26f3b4e43..77451b47b 100644
--- a/src/cull_list.cpp
+++ b/src/cull_list.cpp
@@ -117,18 +117,45 @@ int CullList::Apply()
u->AddToWhoWas();
}
+ bool deleteu = true;
+
if (iter != ServerInstance->Users->clientlist->end())
{
- if (IS_LOCAL(u))
+ 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
+ }
+
+ if (IS_LOCAL(u))
+ {
+ std::vector<User*>::iterator x = find(ServerInstance->Users->local_users.begin(),ServerInstance->Users->local_users.end(),u);
+ if (x != ServerInstance->Users->local_users.end())
+ ServerInstance->Users->local_users.erase(x);
+ else
{
- std::vector<User*>::iterator x = find(ServerInstance->Users->local_users.begin(),ServerInstance->Users->local_users.end(),u);
- if (x != ServerInstance->Users->local_users.end())
- ServerInstance->Users->local_users.erase(x);
+ /*
+ * 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->Users->clientlist->erase(iter);
}
- delete u;
+ if (deleteu)
+ {
+ delete u;
+ }
+
list.erase(list.begin());
}