From b1d159c2254ca98885f98934e89be3eaa3157d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francesco=20Borz=C3=AC?= Date: Thu, 5 Mar 2026 12:41:08 +0100 Subject: [PATCH] fix(Core/Misc): prevent crash and undefined behavior in Warden destructor and Object visibility (#24900) --- src/server/game/Entities/Object/Object.cpp | 15 ++++++++------- src/server/game/Warden/Warden.cpp | 9 ++++++--- src/server/game/Warden/WardenMac.cpp | 7 +++++-- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 921eb4ff3..938086961 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1763,7 +1763,7 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo // pussywizard: arena spectator if (obj->IsPlayer()) - if (((Player const*)obj)->IsSpectator() && ((Player const*)obj)->FindMap()->IsBattleArena()) + if (((Player const*)obj)->IsSpectator() && ((Player const*)obj)->FindMap() && ((Player const*)obj)->FindMap()->IsBattleArena()) return false; bool corpseVisibility = false; @@ -1807,11 +1807,12 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo return false; // pussywizard: during arena preparation, don't allow to detect pets if can't see its owner (spoils enemy arena frames) - if (target->IsPet() && target->GetOwnerGUID() && target->FindMap()->IsBattleArena() && GetGUID() != target->GetOwnerGUID()) - if (BattlegroundMap* bgmap = target->FindMap()->ToBattlegroundMap()) - if (Battleground* bg = bgmap->GetBG()) - if (bg->GetStatus() < STATUS_IN_PROGRESS && !thisPlayer->HaveAtClient(target->GetOwnerGUID())) - return false; + if (Map* targetMap = target->FindMap()) + if (target->IsPet() && target->GetOwnerGUID() && targetMap->IsBattleArena() && GetGUID() != target->GetOwnerGUID()) + if (BattlegroundMap* bgmap = targetMap->ToBattlegroundMap()) + if (Battleground* bg = bgmap->GetBG()) + if (bg->GetStatus() < STATUS_IN_PROGRESS && !thisPlayer->HaveAtClient(target->GetOwnerGUID())) + return false; } if (thisPlayer->GetFarSightDistance() && !thisPlayer->isInFront(obj)) @@ -1856,7 +1857,7 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo // pussywizard: arena spectator if (this->IsPlayer()) - if (((Player const*)this)->IsSpectator() && ((Player const*)this)->FindMap()->IsBattleArena() && (obj->m_invisibility.GetFlags() || obj->m_stealth.GetFlags())) + if (((Player const*)this)->IsSpectator() && ((Player const*)this)->FindMap() && ((Player const*)this)->FindMap()->IsBattleArena() && (obj->m_invisibility.GetFlags() || obj->m_stealth.GetFlags())) return false; if (!CanDetect(obj, ignoreStealth, !distanceCheck, checkAlert)) diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index 1cad8c86b..ba9e6b3df 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -38,9 +38,12 @@ Warden::Warden() : _session(nullptr), _checkTimer(10000/*10 sec*/), _clientRespo Warden::~Warden() { - delete[] _module->CompressedData; - delete _module; - _module = nullptr; + if (_module) + { + delete[] _module->CompressedData; + delete _module; + _module = nullptr; + } _initialized = false; } diff --git a/src/server/game/Warden/WardenMac.cpp b/src/server/game/Warden/WardenMac.cpp index 75e25990b..f3cdf257f 100644 --- a/src/server/game/Warden/WardenMac.cpp +++ b/src/server/game/Warden/WardenMac.cpp @@ -72,9 +72,12 @@ ClientWardenModule* WardenMac::GetModuleForClient() { auto mod = new ClientWardenModule; + uint32 length = Module_0DBBF209A27B1E279A9FEC5C168A15F7_Data.size(); + // data assign - mod->CompressedSize = Module_0DBBF209A27B1E279A9FEC5C168A15F7_Data.size(); - mod->CompressedData = Module_0DBBF209A27B1E279A9FEC5C168A15F7_Data.data(); + mod->CompressedSize = length; + mod->CompressedData = new uint8[length]; + memcpy(mod->CompressedData, Module_0DBBF209A27B1E279A9FEC5C168A15F7_Data.data(), length); // md5 hash mod->Id = Acore::Crypto::MD5::GetDigestOf(mod->CompressedData, mod->CompressedSize);