aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-04-16 23:16:38 +0200
committerShauren <shauren.trinity@gmail.com>2022-06-10 16:51:03 +0200
commita196f8fdecd95fa80342d6db8247f04c8bba1ac4 (patch)
treef7dc38a551f60df13d2a9350cfc5db6ecb68c120 /src
parent833ddfad11fdb6af37bb70296dbc11613f4d0f5f (diff)
Core/PacketIO: Stop WorldSession packet processing loop immediately when AntiDOS kicks/bans the player
(cherry picked from commit 0d0cb23a634a37e2d679a5b8ec2e078d20def66a)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Server/WorldSession.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index e3be227df53..157e680e529 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -344,6 +344,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
uint32 processedPackets = 0;
time_t currentTime = GameTime::GetGameTime();
+ constexpr uint32 MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE = 100;
+
while (m_Socket[CONNECTION_TYPE_REALM] && _recvQueue.next(packet, updater))
{
OpcodeClient opcode = static_cast<OpcodeClient>(packet->GetOpcode());
@@ -373,6 +375,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
sScriptMgr->OnPacketReceive(this, *packet);
opHandle->Call(this, *packet);
}
+ else
+ processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE; // break out of packet processing loop
// lag can cause STATUS_LOGGEDIN opcodes to arrive after the player started a transfer
break;
case STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT:
@@ -385,6 +389,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
sScriptMgr->OnPacketReceive(this, *packet);
opHandle->Call(this, *packet);
}
+ else
+ processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE; // break out of packet processing loop
break;
case STATUS_TRANSFER:
if (!_player)
@@ -396,6 +402,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
sScriptMgr->OnPacketReceive(this, *packet);
opHandle->Call(this, *packet);
}
+ else
+ processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE; // break out of packet processing loop
break;
case STATUS_AUTHED:
// prevent cheating with skip queue wait
@@ -415,6 +423,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
sScriptMgr->OnPacketReceive(this, *packet);
opHandle->Call(this, *packet);
}
+ else
+ processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE; // break out of packet processing loop
break;
case STATUS_NEVER:
TC_LOG_ERROR("network.opcode", "Received not allowed opcode %s from %s", GetOpcodeNameForLogging(static_cast<OpcodeClient>(packet->GetOpcode())).c_str()
@@ -459,7 +469,6 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
deletePacket = true;
-#define MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE 100
processedPackets++;
//process only a max amout of packets in 1 Update() call.