From 3da0f7e40920b652d2222fa88dbb4b516d24725d Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 1 Apr 2015 01:47:40 +0200 Subject: Core/Networking: Fixed deadlock in HandlePing if the client is about to be kicked for overspeed pings --- src/server/game/Server/WorldSocket.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') 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 sessionGuard(_worldSessionLock); + std::unique_lock 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; } -- cgit v1.2.3