aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSovak <sovak007@gmail.com>2014-10-12 12:38:04 +0200
committerShauren <shauren.trinity@gmail.com>2014-10-12 12:38:04 +0200
commitd0db99961f78a950d24cd23250a9438be29ed4ab (patch)
treed01e15aacb4ab9b91a57a55f8dc6e5c155e8150a
parent241fdc49a7c49bdf627aeb0d14b0e6540090a81a (diff)
Core/PacketIO: Restored client opcode handler check lost in ace->boost transition
-rw-r--r--src/server/game/Server/WorldSocket.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index abcf446dd8d..15f311b5d10 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -213,6 +213,17 @@ bool WorldSocket::ReadDataHandler()
return false;
}
+ // prevent invalid memory access/crash with custom opcodes
+ if (opcode >= NUM_OPCODE_HANDLERS)
+ return false;
+
+ OpcodeHandler const* handler = opcodeTable[opcode];
+ if (!handler || handler->Status == STATUS_UNHANDLED)
+ {
+ TC_LOG_ERROR("network.opcode", "No defined handler for opcode %s sent by %s", GetOpcodeNameForLogging(packet.GetOpcode()).c_str(), _worldSession->GetPlayerInfo().c_str());
+ return false;
+ }
+
// Our Idle timer will reset on any non PING opcodes.
// Catches people idling on the login screen and any lingering ingame connections.
_worldSession->ResetTimeOutTime();