diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-10-16 16:31:58 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-10-16 16:31:58 +0200 |
commit | af76b41ace2917ece0aa3f97e4f46e095a7c815f (patch) | |
tree | f1e3299dbc2611a987a88095db1f6b688e85ecfd /src/server | |
parent | 641390dca2329041a6ef513c2c9f7b28d42d2762 (diff) |
Core/Networking: Fixed possible buffer overflows in WorldSocket::WritePacketToBuffer
Closes #28370
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index f762e100f3d..3dfd2d58564 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -203,10 +203,11 @@ bool WorldSocket::Update() MessageBuffer buffer(_sendBufferSize); while (_bufferQueue.Dequeue(queued)) { - uint32 packetSize = queued->size(); + uint32 packetSize = queued->size() + 2 /*opcode*/; if (packetSize > MinSizeForCompression && queued->NeedsEncryption()) - packetSize = compressBound(packetSize) + sizeof(CompressedWorldPacket); + packetSize = deflateBound(_compressionStream, packetSize) + sizeof(CompressedWorldPacket); + // Flush current buffer if too small for next packet if (buffer.GetRemainingSpace() < packetSize + sizeof(PacketHeader)) { QueuePacket(std::move(buffer)); @@ -215,7 +216,7 @@ bool WorldSocket::Update() if (buffer.GetRemainingSpace() >= packetSize + sizeof(PacketHeader)) WritePacketToBuffer(*queued, buffer); - else // single packet larger than 4096 bytes + else // single packet larger than _sendBufferSize { MessageBuffer packetBuffer(packetSize + sizeof(PacketHeader)); WritePacketToBuffer(*queued, packetBuffer); |