From 763a521da800da971d274ab44437106088593a5b Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Tue, 10 May 2022 17:17:07 +0200 Subject: [PATCH] =?UTF-8?q?fix(Core/PacketIO):=20Stop=20WorldSession=20pac?= =?UTF-8?q?ket=20processing=20loop=20immediat=E2=80=A6=20(#11680)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(Core/PacketIO): Stop WorldSession packet processing loop immediately when AntiDOS kicks/bans the player * cherry-pick commit (https://github.com/TrinityCore/TrinityCore/commit/0d0cb23a634a37e2d679a5b8ec2e078d20def66a) Co-Authored-By: Shauren * Update WorldSession.cpp * Update src/server/game/Server/WorldSession.cpp Co-authored-by: Shauren --- src/server/game/Server/WorldSession.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index cbf0655c4..85bcb5972 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -309,6 +309,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) uint32 processedPackets = 0; time_t currentTime = GameTime::GetGameTime().count(); + constexpr uint32 MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE = 150; + while (m_Socket && _recvQueue.next(packet, updater)) { OpcodeClient opcode = static_cast(packet->GetOpcode()); @@ -349,6 +351,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) opHandle->Call(this, *packet); LogUnprocessedTail(packet); } + else + processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE; // break out of packet processing loop break; case STATUS_TRANSFER: if (_player && !_player->IsInWorld() && AntiDOS.EvaluateOpcode(*packet, currentTime)) @@ -361,6 +365,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) opHandle->Call(this, *packet); LogUnprocessedTail(packet); } + else + processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE; // break out of packet processing loop break; case STATUS_AUTHED: if (m_inQueue) // prevent cheating @@ -376,6 +382,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) opHandle->Call(this, *packet); LogUnprocessedTail(packet); } + else + processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE; // break out of packet processing loop break; case STATUS_NEVER: LOG_ERROR("network.opcode", "Received not allowed opcode {} from {}", @@ -427,7 +435,6 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) deletePacket = true; -#define MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE 150 processedPackets++; //process only a max amout of packets in 1 Update() call.