diff options
author | Shauren <shauren.trinity@gmail.com> | 2014-12-24 13:48:52 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2014-12-24 13:48:52 +0100 |
commit | 911d0cf400b8e06def13e649cc7415bfd288f742 (patch) | |
tree | a384b371f0ec08ea0c0be39d4d3070b516319e0d | |
parent | c57171041b31da644b743ab811513baa05c85331 (diff) |
Core/Battle.net: Fixed client crashes happening when reconnecting too soon after being kicked
-rw-r--r-- | src/server/bnetserver/Realms/WorldListener.cpp | 20 | ||||
-rw-r--r-- | src/server/bnetserver/Server/Session.cpp | 2 | ||||
-rw-r--r-- | src/server/bnetserver/Server/Session.h | 4 | ||||
-rw-r--r-- | src/server/bnetserver/Server/SessionManager.cpp | 6 |
4 files changed, 22 insertions, 10 deletions
diff --git a/src/server/bnetserver/Realms/WorldListener.cpp b/src/server/bnetserver/Realms/WorldListener.cpp index 9c9f1029e87..d84425496c7 100644 --- a/src/server/bnetserver/Realms/WorldListener.cpp +++ b/src/server/bnetserver/Realms/WorldListener.cpp @@ -97,15 +97,19 @@ void WorldListener::HandleToonOnlineStatusChange(Battlenet::RealmHandle const& r { if (online) { - Battlenet::WoWRealm::ToonReady* toonReady = new Battlenet::WoWRealm::ToonReady(); - toonReady->Realm.Battlegroup = realm.Battlegroup; - toonReady->Realm.Index = realm.Index; - toonReady->Realm.Region = realm.Region; - toonReady->Guid = toonHandle.Guid; - toonReady->Name = toonHandle.Name; - session->AsyncWrite(toonReady); + if (!session->IsToonOnline()) + { + Battlenet::WoWRealm::ToonReady* toonReady = new Battlenet::WoWRealm::ToonReady(); + toonReady->Realm.Battlegroup = realm.Battlegroup; + toonReady->Realm.Index = realm.Index; + toonReady->Realm.Region = realm.Region; + toonReady->Guid = toonHandle.Guid; + toonReady->Name = toonHandle.Name; + session->SetToonOnline(true); + session->AsyncWrite(toonReady); + } } - else + else if (session->IsToonOnline()) session->AsyncWrite(new Battlenet::WoWRealm::ToonLoggedOut()); } } diff --git a/src/server/bnetserver/Server/Session.cpp b/src/server/bnetserver/Server/Session.cpp index fd6784152e8..f0940aa6947 100644 --- a/src/server/bnetserver/Server/Session.cpp +++ b/src/server/bnetserver/Server/Session.cpp @@ -38,7 +38,7 @@ Battlenet::Session::ModuleHandler const Battlenet::Session::ModuleHandlers[MODUL Battlenet::Session::Session(tcp::socket&& socket) : Socket(std::move(socket)), _accountId(0), _accountName(), _locale(), _os(), _build(0), _gameAccountId(0), _gameAccountName(), _accountSecurityLevel(SEC_PLAYER), I(), s(), v(), b(), B(), K(), - _reconnectProof(), _crypt(), _authed(false), _subscribedToRealmListUpdates(false) + _reconnectProof(), _crypt(), _authed(false), _subscribedToRealmListUpdates(false), _toonOnline(false) { static uint8 const N_Bytes[] = { diff --git a/src/server/bnetserver/Server/Session.h b/src/server/bnetserver/Server/Session.h index 4a1feb7c8a8..ab373ebe6cc 100644 --- a/src/server/bnetserver/Server/Session.h +++ b/src/server/bnetserver/Server/Session.h @@ -91,6 +91,9 @@ namespace Battlenet uint32 GetAccountId() const { return _accountId; } uint32 GetGameAccountId() const { return _gameAccountId; } + bool IsToonOnline() const { return _toonOnline; } + void SetToonOnline(bool online) { _toonOnline = online; } + bool IsSubscribedToRealmListUpdates() const { return _subscribedToRealmListUpdates; } void AsyncWrite(ServerPacket* packet); @@ -141,6 +144,7 @@ namespace Battlenet PacketCrypt _crypt; bool _authed; bool _subscribedToRealmListUpdates; + bool _toonOnline; }; } diff --git a/src/server/bnetserver/Server/SessionManager.cpp b/src/server/bnetserver/Server/SessionManager.cpp index 9e5836dab8d..6c52ee477f1 100644 --- a/src/server/bnetserver/Server/SessionManager.cpp +++ b/src/server/bnetserver/Server/SessionManager.cpp @@ -46,7 +46,11 @@ void Battlenet::SessionManager::AddSession(Session* session) void Battlenet::SessionManager::RemoveSession(Session* session) { std::unique_lock<boost::shared_mutex> lock(_sessionMutex); - _sessions.erase({ session->GetAccountId(), session->GetGameAccountId() }); + auto itr = _sessions.find({ session->GetAccountId(), session->GetGameAccountId() }); + // Remove old session only if it was not overwritten by reconnecting + if (itr != _sessions.end() && itr->second == session) + _sessions.erase(itr); + _sessionsByAccountId[session->GetAccountId()].remove(session); } |