aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-12-24 13:48:52 +0100
committerShauren <shauren.trinity@gmail.com>2014-12-24 13:48:52 +0100
commit911d0cf400b8e06def13e649cc7415bfd288f742 (patch)
treea384b371f0ec08ea0c0be39d4d3070b516319e0d
parentc57171041b31da644b743ab811513baa05c85331 (diff)
Core/Battle.net: Fixed client crashes happening when reconnecting too soon after being kicked
-rw-r--r--src/server/bnetserver/Realms/WorldListener.cpp20
-rw-r--r--src/server/bnetserver/Server/Session.cpp2
-rw-r--r--src/server/bnetserver/Server/Session.h4
-rw-r--r--src/server/bnetserver/Server/SessionManager.cpp6
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);
}