mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-04-17 17:43:52 +00:00
fix(combatlog): validate classic spell damage and heal GUIDs
This commit is contained in:
parent
011a148105
commit
6a7071fd64
1 changed files with 24 additions and 4 deletions
|
|
@ -4,6 +4,26 @@
|
||||||
namespace wowee {
|
namespace wowee {
|
||||||
namespace game {
|
namespace game {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
bool hasFullPackedGuid(const network::Packet& packet) {
|
||||||
|
if (packet.getReadPos() >= packet.getSize()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& rawData = packet.getData();
|
||||||
|
const uint8_t mask = rawData[packet.getReadPos()];
|
||||||
|
size_t guidBytes = 1;
|
||||||
|
for (int bit = 0; bit < 8; ++bit) {
|
||||||
|
if ((mask & (1u << bit)) != 0) {
|
||||||
|
++guidBytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return packet.getSize() - packet.getReadPos() >= guidBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// Classic 1.12.1 movement flag constants
|
// Classic 1.12.1 movement flag constants
|
||||||
// Key differences from TBC:
|
// Key differences from TBC:
|
||||||
|
|
@ -497,10 +517,10 @@ bool ClassicPacketParsers::parseAttackerStateUpdate(network::Packet& packet, Att
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
bool ClassicPacketParsers::parseSpellDamageLog(network::Packet& packet, SpellDamageLogData& data) {
|
bool ClassicPacketParsers::parseSpellDamageLog(network::Packet& packet, SpellDamageLogData& data) {
|
||||||
auto rem = [&]() { return packet.getSize() - packet.getReadPos(); };
|
auto rem = [&]() { return packet.getSize() - packet.getReadPos(); };
|
||||||
if (rem() < 2) return false;
|
if (rem() < 2 || !hasFullPackedGuid(packet)) return false;
|
||||||
|
|
||||||
data.targetGuid = UpdateObjectParser::readPackedGuid(packet); // PackedGuid in Vanilla
|
data.targetGuid = UpdateObjectParser::readPackedGuid(packet); // PackedGuid in Vanilla
|
||||||
if (rem() < 1) return false;
|
if (rem() < 1 || !hasFullPackedGuid(packet)) return false;
|
||||||
data.attackerGuid = UpdateObjectParser::readPackedGuid(packet); // PackedGuid in Vanilla
|
data.attackerGuid = UpdateObjectParser::readPackedGuid(packet); // PackedGuid in Vanilla
|
||||||
|
|
||||||
// uint32(spellId) + uint32(damage) + uint8(schoolMask) + uint32(absorbed)
|
// uint32(spellId) + uint32(damage) + uint8(schoolMask) + uint32(absorbed)
|
||||||
|
|
@ -532,10 +552,10 @@ bool ClassicPacketParsers::parseSpellDamageLog(network::Packet& packet, SpellDam
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
bool ClassicPacketParsers::parseSpellHealLog(network::Packet& packet, SpellHealLogData& data) {
|
bool ClassicPacketParsers::parseSpellHealLog(network::Packet& packet, SpellHealLogData& data) {
|
||||||
auto rem = [&]() { return packet.getSize() - packet.getReadPos(); };
|
auto rem = [&]() { return packet.getSize() - packet.getReadPos(); };
|
||||||
if (rem() < 2) return false;
|
if (rem() < 2 || !hasFullPackedGuid(packet)) return false;
|
||||||
|
|
||||||
data.targetGuid = UpdateObjectParser::readPackedGuid(packet); // PackedGuid in Vanilla
|
data.targetGuid = UpdateObjectParser::readPackedGuid(packet); // PackedGuid in Vanilla
|
||||||
if (rem() < 1) return false;
|
if (rem() < 1 || !hasFullPackedGuid(packet)) return false;
|
||||||
data.casterGuid = UpdateObjectParser::readPackedGuid(packet); // PackedGuid in Vanilla
|
data.casterGuid = UpdateObjectParser::readPackedGuid(packet); // PackedGuid in Vanilla
|
||||||
|
|
||||||
if (rem() < 13) return false; // uint32 + uint32 + uint32 + uint8 = 13 bytes
|
if (rem() < 13) return false; // uint32 + uint32 + uint32 + uint8 = 13 bytes
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue