aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-08-07 19:02:08 +0200
committerShauren <shauren.trinity@gmail.com>2014-08-10 11:00:27 +0200
commitdf11916ad53e6b2f64cd1af5d5296ba188f3e486 (patch)
tree0ece1cfd1133e8ecedede59956e3de1578798807 /src/server/game
parent91053d557ca89c4b0c455366afae258835bd25f8 (diff)
Core/NetworkIO: Allow receiving packets bigger than buffer size and properly handle situations where not entire packet was read in one go
Core/Authserver: Restored authenticator functionality
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/Server/WorldSocket.cpp109
-rw-r--r--src/server/game/Server/WorldSocket.h4
2 files changed, 48 insertions, 65 deletions
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 65a424d5d75..046cdc0acd3 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -54,89 +54,72 @@ void WorldSocket::HandleSendAuthSession()
AsyncWrite(packet);
}
-void WorldSocket::ReadHeaderHandler(boost::system::error_code error, size_t transferedBytes)
+void WorldSocket::ReadHeaderHandler()
{
- if (!error && transferedBytes == sizeof(ClientPktHeader))
- {
- _authCrypt.DecryptRecv(GetReadBuffer(), sizeof(ClientPktHeader));
+ _authCrypt.DecryptRecv(GetHeaderBuffer(), sizeof(ClientPktHeader));
- ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(GetReadBuffer());
- EndianConvertReverse(header->size);
- EndianConvert(header->cmd);
+ ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(GetHeaderBuffer());
+ EndianConvertReverse(header->size);
+ EndianConvert(header->cmd);
- AsyncReadData(header->size - sizeof(header->cmd), sizeof(ClientPktHeader));
- }
- else
- CloseSocket();
+ AsyncReadData(header->size - sizeof(header->cmd));
}
-void WorldSocket::ReadDataHandler(boost::system::error_code error, size_t transferedBytes)
+void WorldSocket::ReadDataHandler()
{
- ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(GetReadBuffer());
+ ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(GetHeaderBuffer());
- if (!error && transferedBytes == (header->size - sizeof(header->cmd)))
- {
- header->size -= sizeof(header->cmd);
-
- uint16 opcode = uint16(header->cmd);
+ header->size -= sizeof(header->cmd);
- std::string opcodeName = GetOpcodeNameForLogging(opcode);
+ uint16 opcode = uint16(header->cmd);
- WorldPacket packet(opcode, header->size);
+ std::string opcodeName = GetOpcodeNameForLogging(opcode);
- if (header->size > 0)
- {
- packet.resize(header->size);
+ WorldPacket packet(opcode, MoveData());
- std::memcpy(packet.contents(), &(GetReadBuffer()[sizeof(ClientPktHeader)]), header->size);
- }
-
- if (sPacketLog->CanLogPacket())
- sPacketLog->LogPacket(packet, CLIENT_TO_SERVER, GetRemoteIpAddress(), GetRemotePort());
+ if (sPacketLog->CanLogPacket())
+ sPacketLog->LogPacket(packet, CLIENT_TO_SERVER, GetRemoteIpAddress(), GetRemotePort());
- TC_LOG_TRACE("network.opcode", "C->S: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress().to_string()).c_str(), GetOpcodeNameForLogging(opcode).c_str());
+ TC_LOG_TRACE("network.opcode", "C->S: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress().to_string()).c_str(), opcodeName.c_str());
- switch (opcode)
- {
- case CMSG_PING:
- HandlePing(packet);
+ switch (opcode)
+ {
+ case CMSG_PING:
+ HandlePing(packet);
+ break;
+ case CMSG_AUTH_SESSION:
+ if (_worldSession)
+ {
+ TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
break;
- case CMSG_AUTH_SESSION:
- if (_worldSession)
- {
- TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
- break;
- }
+ }
- sScriptMgr->OnPacketReceive(shared_from_this(), packet);
- HandleAuthSession(packet);
- break;
- case CMSG_KEEP_ALIVE:
- TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
- sScriptMgr->OnPacketReceive(shared_from_this(), packet);
- break;
- default:
+ sScriptMgr->OnPacketReceive(shared_from_this(), packet);
+ HandleAuthSession(packet);
+ break;
+ case CMSG_KEEP_ALIVE:
+ TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
+ sScriptMgr->OnPacketReceive(shared_from_this(), packet);
+ break;
+ default:
+ {
+ if (!_worldSession)
{
- if (!_worldSession)
- {
- TC_LOG_ERROR("network.opcode", "ProcessIncoming: Client not authed opcode = %u", uint32(opcode));
- break;
- }
-
- // Our Idle timer will reset on any non PING opcodes.
- // Catches people idling on the login screen and any lingering ingame connections.
- _worldSession->ResetTimeOutTime();
-
- // Copy the packet to the heap before enqueuing
- _worldSession->QueuePacket(new WorldPacket(packet));
+ TC_LOG_ERROR("network.opcode", "ProcessIncoming: Client not authed opcode = %u", uint32(opcode));
break;
}
- }
- AsyncReadHeader();
+ // Our Idle timer will reset on any non PING opcodes.
+ // Catches people idling on the login screen and any lingering ingame connections.
+ _worldSession->ResetTimeOutTime();
+
+ // Copy the packet to the heap before enqueuing
+ _worldSession->QueuePacket(new WorldPacket(std::move(packet)));
+ break;
+ }
}
- else
- CloseSocket();
+
+ AsyncReadHeader();
}
void WorldSocket::AsyncWrite(WorldPacket& packet)
diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h
index 7275da5ff29..8d452677650 100644
--- a/src/server/game/Server/WorldSocket.h
+++ b/src/server/game/Server/WorldSocket.h
@@ -108,8 +108,8 @@ public:
void AsyncWrite(WorldPacket& packet);
protected:
- void ReadHeaderHandler(boost::system::error_code error, size_t transferedBytes) override;
- void ReadDataHandler(boost::system::error_code error, size_t transferedBytes) override;
+ void ReadHeaderHandler() override;
+ void ReadDataHandler() override;
private:
void HandleSendAuthSession();