aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-04-01 01:47:40 +0200
committerShauren <shauren.trinity@gmail.com>2015-04-01 01:47:40 +0200
commit3da0f7e40920b652d2222fa88dbb4b516d24725d (patch)
tree25d1693c09cff9843008d4577744426068945e0d /src
parent5389180778f2ac25da421fea698a1657752c5731 (diff)
Core/Networking: Fixed deadlock in HandlePing if the client is about to be kicked for overspeed pings
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Server/WorldSocket.cpp4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 963d6a1b71e..b0c7631f986 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -832,13 +832,15 @@ void WorldSocket::HandlePing(WorldPacket& recvPacket)
if (maxAllowed && _OverSpeedPings > maxAllowed)
{
- std::lock_guard<std::mutex> sessionGuard(_worldSessionLock);
+ std::unique_lock<std::mutex> sessionGuard(_worldSessionLock);
if (_worldSession && !_worldSession->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_OVERSPEED_PING))
{
TC_LOG_ERROR("network", "WorldSocket::HandlePing: %s kicked for over-speed pings (address: %s)",
_worldSession->GetPlayerInfo().c_str(), GetRemoteIpAddress().to_string().c_str());
+ // this is bad but we will pretend this code isn't here - it only happens once per socket in worst case
+ sessionGuard.unlock();
CloseSocket();
return;
}