diff options
Diffstat (limited to 'src')
-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()); } |