From 110d053f8c7cf704a2ef642cb092ed76a8d54b0d Mon Sep 17 00:00:00 2001 From: w00t Date: Mon, 19 May 2008 10:27:34 +0000 Subject: 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 --- src/cull_list.cpp | 39 +++++++++++++++++++++++++++++++++------ 1 file 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::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::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()); } -- cgit v1.2.3