fix(Core/PacketIO): Stop WorldSession packet processing loop immediat… (#11680)

* fix(Core/PacketIO): Stop WorldSession packet processing loop immediately when AntiDOS kicks/bans the player

* cherry-pick commit (0d0cb23a63)

Co-Authored-By: Shauren <shauren.trinity@gmail.com>

* Update WorldSession.cpp

* Update src/server/game/Server/WorldSession.cpp

Co-authored-by: Shauren <shauren.trinity@gmail.com>
This commit is contained in:
Kitzunu
2022-05-10 17:17:07 +02:00
committed by GitHub
parent 27fe28083c
commit 763a521da8

View File

@@ -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<OpcodeClient>(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.