aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Server/WorldSocket.cpp50
-rw-r--r--src/server/game/Server/WorldSocket.h2
2 files changed, 17 insertions, 35 deletions
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index b0c7631f986..2b2b2458993 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -131,7 +131,10 @@ void WorldSocket::ReadHandler()
// We just received nice new header
if (!ReadHeaderHandler())
+ {
+ CloseSocket();
return;
+ }
}
// We have full read header, now check the data payload
@@ -152,7 +155,10 @@ void WorldSocket::ReadHandler()
// just received fresh new payload
if (!ReadDataHandler())
+ {
+ CloseSocket();
return;
+ }
_headerBuffer.Reset();
}
@@ -192,8 +198,6 @@ bool WorldSocket::ReadHeaderHandler()
{
TC_LOG_ERROR("network", "WorldSocket::ReadHeaderHandler(): client %s sent malformed packet (size: %u, cmd: %u)",
GetRemoteIpAddress().to_string().c_str(), size, opcode);
-
- CloseSocket();
return false;
}
@@ -224,22 +228,15 @@ bool WorldSocket::ReadDataHandler()
{
case CMSG_PING:
LogOpcodeText(opcode, sessionGuard);
- HandlePing(packet);
- break;
+ return HandlePing(packet);
case CMSG_AUTH_SESSION:
{
LogOpcodeText(opcode, sessionGuard);
if (_authed)
{
// locking just to safely log offending user is probably overkill but we are disconnecting him anyway
- {
- if (sessionGuard.try_lock())
- {
- TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
- sessionGuard.unlock(); // unlock session guard to prevent deadlocking in CloseSocket
- }
- }
- CloseSocket();
+ if (sessionGuard.try_lock())
+ TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
return false;
}
@@ -254,14 +251,8 @@ bool WorldSocket::ReadDataHandler()
if (_authed)
{
// locking just to safely log offending user is probably overkill but we are disconnecting him anyway
- {
- if (sessionGuard.try_lock())
- {
- TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_CONTINUED_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
- sessionGuard.unlock(); // unlock session guard to prevent deadlocking in CloseSocket
- }
- }
- CloseSocket();
+ if (sessionGuard.try_lock())
+ TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_CONTINUED_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
return false;
}
@@ -300,7 +291,6 @@ bool WorldSocket::ReadDataHandler()
if (!_worldSession)
{
TC_LOG_ERROR("network.opcode", "ProcessIncoming: Client not authed opcode = %u", uint32(opcode));
- CloseSocket();
return false;
}
@@ -325,10 +315,7 @@ bool WorldSocket::ReadDataHandler()
{
std::string initializer(reinterpret_cast<char const*>(_packetBuffer.GetReadPointer()), std::min(_packetBuffer.GetActiveSize(), ClientConnectionInitialize.length()));
if (initializer != ClientConnectionInitialize)
- {
- CloseSocket();
return false;
- }
_compressionStream = new z_stream();
_compressionStream->zalloc = (alloc_func)NULL;
@@ -340,7 +327,6 @@ bool WorldSocket::ReadDataHandler()
if (z_res != Z_OK)
{
TC_LOG_ERROR("network", "Can't initialize packet compression (zlib: deflateInit) Error code: %i (%s)", z_res, zError(z_res));
- CloseSocket();
return false;
}
@@ -803,7 +789,7 @@ void WorldSocket::SendAuthResponseError(uint8 code)
SendPacketAndLogOpcode(*response.Write());
}
-void WorldSocket::HandlePing(WorldPacket& recvPacket)
+bool WorldSocket::HandlePing(WorldPacket& recvPacket)
{
uint32 ping;
uint32 latency;
@@ -839,10 +825,7 @@ void WorldSocket::HandlePing(WorldPacket& recvPacket)
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;
+ return false;
}
}
}
@@ -861,13 +844,12 @@ void WorldSocket::HandlePing(WorldPacket& recvPacket)
else
{
TC_LOG_ERROR("network", "WorldSocket::HandlePing: peer sent CMSG_PING, but is not authenticated or got recently kicked, address = %s", GetRemoteIpAddress().to_string().c_str());
-
- CloseSocket();
- return;
+ return false;
}
}
WorldPacket packet(SMSG_PONG, 4);
packet << ping;
- return SendPacketAndLogOpcode(packet);
+ SendPacketAndLogOpcode(packet);
+ return true;
}
diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h
index 45e19a93767..13fab8960fc 100644
--- a/src/server/game/Server/WorldSocket.h
+++ b/src/server/game/Server/WorldSocket.h
@@ -106,7 +106,7 @@ private:
void HandleConnectToFailed(WorldPackets::Auth::ConnectToFailed& connectToFailed);
void SendAuthResponseError(uint8 code);
- void HandlePing(WorldPacket& recvPacket);
+ bool HandlePing(WorldPacket& recvPacket);
void ExtractOpcodeAndSize(ClientPktHeader const* header, uint32& opcode, uint32& size) const;