diff options
author | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2009-11-01 21:53:47 +0000 |
---|---|---|
committer | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2009-11-01 21:53:47 +0000 |
commit | 18ab1f358acd2ccdd2f95054ec56b83f17f18ddd (patch) | |
tree | fa4134b463e810124ed0de5a53eab6f80cd956bb | |
parent | 9e110fbd1db97d382efb1c2e2448fcd874e7e47b (diff) |
Fix global clone count not being decremented on remote user quit
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11984 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r-- | include/users.h | 2 | ||||
-rw-r--r-- | src/usermanager.cpp | 22 | ||||
-rw-r--r-- | src/users.cpp | 11 |
3 files changed, 19 insertions, 16 deletions
diff --git a/include/users.h b/include/users.h index 48f2b470c..ed649f1b9 100644 --- a/include/users.h +++ b/include/users.h @@ -723,7 +723,7 @@ class CoreExport LocalUser : public User InvitedList invites; public: - LocalUser(); + LocalUser(int fd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server); CullResult cull(); /** Stats counter for bytes inbound diff --git a/src/usermanager.cpp b/src/usermanager.cpp index f620a264d..05f5d2c9d 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -24,7 +24,7 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs LocalUser* New = NULL; try { - New = new LocalUser(); + New = new LocalUser(socket, client, server); } catch (...) { @@ -33,10 +33,6 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs return; } - New->SetFd(socket); - memcpy(&New->client_sa, client, sizeof(irc::sockets::sockaddrs)); - memcpy(&New->server_sa, server, sizeof(irc::sockets::sockaddrs)); - /* Give each of the modules an attempt to hook the user for I/O */ FOREACH_MOD(I_OnHookIO, OnHookIO(New, via)); @@ -56,10 +52,9 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs this->unregistered_count++; - (*(this->clientlist))[New->uuid] = New; - /* The users default nick is their UUID */ New->nick.assign(New->uuid, 0, ServerInstance->Config->Limits.NickMax); + (*(this->clientlist))[New->nick] = New; New->ident.assign("unknown"); @@ -271,13 +266,16 @@ void UserManager::AddGlobalClone(User *user) void UserManager::RemoveCloneCounts(User *user) { - clonemap::iterator x = local_clones.find(user->GetCIDRMask()); - if (x != local_clones.end()) + if (IS_LOCAL(user)) { - x->second--; - if (!x->second) + clonemap::iterator x = local_clones.find(user->GetCIDRMask()); + if (x != local_clones.end()) { - local_clones.erase(x); + x->second--; + if (!x->second) + { + local_clones.erase(x); + } } } diff --git a/src/users.cpp b/src/users.cpp index 58c105047..c2cda4aea 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -239,12 +239,16 @@ User::User(const std::string &uid, const std::string& sid, int type) throw CoreException("Duplicate UUID "+std::string(uuid)+" in User constructor"); } -LocalUser::LocalUser() : User(ServerInstance->GetUID(), ServerInstance->Config->ServerName, USERTYPE_LOCAL) +LocalUser::LocalUser(int myfd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* servaddr) + : User(ServerInstance->GetUID(), ServerInstance->Config->ServerName, USERTYPE_LOCAL) { bytes_in = bytes_out = cmds_in = cmds_out = 0; server_sa.sa.sa_family = AF_UNSPEC; Penalty = 0; lastping = nping = 0; + SetFd(myfd); + memcpy(&client_sa, client, sizeof(irc::sockets::sockaddrs)); + memcpy(&server_sa, servaddr, sizeof(irc::sockets::sockaddrs)); } User::~User() @@ -588,6 +592,9 @@ CullResult User::cull() this->InvalidateCache(); this->DecrementModes(); + if (client_sa.sa.sa_family != AF_UNSPEC) + ServerInstance->Users->RemoveCloneCounts(this); + ServerInstance->Users->uuidlist->erase(uuid); return Extensible::cull(); } @@ -600,8 +607,6 @@ CullResult LocalUser::cull() else ServerInstance->Logs->Log("USERS", DEBUG, "Failed to remove user from vector"); - if (client_sa.sa.sa_family != AF_UNSPEC) - ServerInstance->Users->RemoveCloneCounts(this); Close(); return User::cull(); } |