aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-09-12 22:09:07 +0200
committerShauren <shauren.trinity@gmail.com>2014-09-12 22:09:07 +0200
commitee0df6aa863480f6e3fb631067971195a82ecc9a (patch)
tree572cb618ee41d4b42c0fecb2ea2f29ed6224160c /src/server/game/Server
parentde4aea093bdb7bba5a3c2aad98a52dfa7d5071e2 (diff)
Core/NetworkIO: Applied 4.3.4 changes to "new" network code
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/WorldSocket.cpp24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index cb42732b464..83bf2c2fff8 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -36,7 +36,7 @@ std::string const WorldSocket::ClientConnectionInitialize("WORLD OF WARCRAFT CON
WorldSocket::WorldSocket(tcp::socket&& socket)
: Socket(std::move(socket)), _authSeed(rand32()), _OverSpeedPings(0), _worldSession(nullptr), _initialized(false)
{
- _headerBuffer.Resize(sizeof(ClientPktHeader));
+ _headerBuffer.Resize(2);
}
void WorldSocket::Start()
@@ -46,7 +46,7 @@ void WorldSocket::Start()
MessageBuffer initializer;
ServerPktHeader header(ServerConnectionInitialize.size(), 0);
initializer.Write(header.header, header.getHeaderLength() - 2);
- initializer.Write((void*)ServerConnectionInitialize.c_str(), ServerConnectionInitialize.length());
+ initializer.Write(ServerConnectionInitialize.c_str(), ServerConnectionInitialize.length());
std::unique_lock<std::mutex> dummy(_writeLock, std::defer_lock);
QueuePacket(std::move(initializer), dummy);
@@ -123,15 +123,17 @@ void WorldSocket::ReadHandler()
bool WorldSocket::ReadHeaderHandler()
{
- ASSERT(_headerBuffer.GetActiveSize() == sizeof(ClientPktHeader));
+ ASSERT(_headerBuffer.GetActiveSize() == (_initialized ? sizeof(ClientPktHeader) : 2));
- _authCrypt.DecryptRecv(_headerBuffer.GetReadPointer(), sizeof(ClientPktHeader));
+ _authCrypt.DecryptRecv(_headerBuffer.GetReadPointer(), _headerBuffer.GetActiveSize());
ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(_headerBuffer.GetReadPointer());
EndianConvertReverse(header->size);
- EndianConvert(header->cmd);
- if (!header->IsValidSize() || !header->IsValidOpcode())
+ if (_initialized)
+ EndianConvert(header->cmd);
+
+ if (!header->IsValidSize() || (_initialized && !header->IsValidOpcode()))
{
if (_worldSession)
{
@@ -147,7 +149,9 @@ bool WorldSocket::ReadHeaderHandler()
return false;
}
- header->size -= sizeof(header->cmd);
+ if (_initialized)
+ header->size -= sizeof(header->cmd);
+
_packetBuffer.Resize(header->size);
return true;
}
@@ -221,9 +225,7 @@ bool WorldSocket::ReadDataHandler()
}
else
{
- ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(_headerBuffer.GetReadPointer());
-
- std::string initializer(reinterpret_cast<char const*>(_packetBuffer.GetReadPointer()), header->size);
+ std::string initializer(reinterpret_cast<char const*>(_packetBuffer.GetReadPointer()), std::min(_packetBuffer.GetActiveSize(), ClientConnectionInitialize.length()));
if (initializer != ClientConnectionInitialize)
{
CloseSocket();
@@ -231,6 +233,8 @@ bool WorldSocket::ReadDataHandler()
}
_initialized = true;
+ _headerBuffer.Resize(sizeof(ClientPktHeader));
+ _packetBuffer.Reset();
HandleSendAuthSession();
}