diff options
author | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-05-19 10:27:34 +0000 |
---|---|---|
committer | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-05-19 10:27:34 +0000 |
commit | 110d053f8c7cf704a2ef642cb092ed76a8d54b0d (patch) | |
tree | fa6f2ae1052b321ba042433303a254128ab12e49 | |
parent | 2df1a3de458cbc1727f35dbe8b0bb949d2485db8 (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.cpp | 39 |
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()); } |