From fb6365ac689419a2e5dd758d4bf70c1a20ff41ff Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sun, 20 Apr 2014 00:38:25 +0200 Subject: [PATCH] Core/Misc: Check GetVictim() for NULL before dereferencing it Add additional NULL checks all around the code before dereferencing GetVictim() result. Keep in mind UpdateVictim() result has nothing to do with GetVictim() result and the caller shouldn't assume anything about GetVictim() based on UpdateVictim(). --- src/server/game/AI/CoreAI/CombatAI.cpp | 2 +- .../Karazhan/boss_prince_malchezaar.cpp | 2 +- .../EasternKingdoms/ScarletEnclave/chapter1.cpp | 4 ++-- .../EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp | 2 +- .../scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp | 3 ++- .../scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp | 3 ++- .../scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp | 9 ++++++--- .../Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp | 3 ++- src/server/scripts/Kalimdor/zone_tanaris.cpp | 2 +- .../scripts/Northrend/Nexus/Oculus/boss_urom.cpp | 11 +++++++---- .../scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp | 5 ++++- .../scripts/Outland/BlackTemple/boss_illidan.cpp | 2 +- .../Outland/BlackTemple/boss_reliquary_of_souls.cpp | 2 +- .../SerpentShrine/boss_fathomlord_karathress.cpp | 3 ++- .../SerpentShrine/boss_leotheras_the_blind.cpp | 2 +- .../TempestKeep/botanica/boss_warp_splinter.cpp | 4 ++-- src/server/scripts/Pet/pet_hunter.cpp | 2 +- 17 files changed, 37 insertions(+), 24 deletions(-) diff --git a/src/server/game/AI/CoreAI/CombatAI.cpp b/src/server/game/AI/CoreAI/CombatAI.cpp index 32b229a5ea..27144728a3 100644 --- a/src/server/game/AI/CoreAI/CombatAI.cpp +++ b/src/server/game/AI/CoreAI/CombatAI.cpp @@ -151,7 +151,7 @@ void CasterAI::UpdateAI(uint32 diff) events.Update(diff); - if (me->EnsureVictim()->HasBreakableByDamageCrowdControlAura(me)) + if (me->GetVictim() && me->EnsureVictim()->HasBreakableByDamageCrowdControlAura(me)) { me->InterruptNonMeleeSpells(false); return; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp index 209154ec5f..92cdb40dc7 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp @@ -391,7 +391,7 @@ public: if (me->HasUnitState(UNIT_STATE_STUNNED)) // While shifting to phase 2 malchezaar stuns himself return; - if (me->GetUInt64Value(UNIT_FIELD_TARGET) != me->EnsureVictim()->GetGUID()) + if (me->GetVictim() && me->GetUInt64Value(UNIT_FIELD_TARGET) != me->EnsureVictim()->GetGUID()) me->SetTarget(me->EnsureVictim()->GetGUID()); if (phase == 1) diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 93fe8ad5c4..936bf51e45 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -484,7 +484,7 @@ public: EnterEvadeMode(); return; } - else if (me->EnsureVictim()->GetTypeId() == TYPEID_PLAYER && me->EnsureVictim()->HealthBelowPct(10)) + else if (me->GetVictim() && me->EnsureVictim()->GetTypeId() == TYPEID_PLAYER && me->EnsureVictim()->HealthBelowPct(10)) { me->EnsureVictim()->CastSpell(me->GetVictim(), 7267, true); // beg me->EnsureVictim()->RemoveGameObject(SPELL_DUEL_FLAG, true); @@ -832,7 +832,7 @@ public: } } - if (!UpdateVictim()) + if (!UpdateVictim() || !me->GetVictim()) return; //ScriptedAI::UpdateAI(diff); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index a03455f621..b57ffa7bc9 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -298,7 +298,7 @@ public: Unit* target = (*itr)->getTarget(); if (target && target->GetTypeId() == TYPEID_PLAYER - && target->GetGUID() != me->EnsureVictim()->GetGUID() + && (!target->GetVictim() || target->GetGUID() != me->EnsureVictim()->GetGUID()) && target->GetPositionZ() > me->GetPositionZ() - 5 && !target->HasAura(AURA_SPECTRAL_EXHAUSTION)) { diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index d26108f569..d6c67ea2ea 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -887,7 +887,8 @@ class boss_fenstalker : public CreatureScript if (volatileinf_timer <= diff) { // core bug - me->EnsureVictim()->CastSpell(me->GetVictim(), SPELL_VOLATILE_INFECTION, false); + if (me->GetVictim()) + me->EnsureVictim()->CastSpell(me->GetVictim(), SPELL_VOLATILE_INFECTION, false); volatileinf_timer = 12000; } else volatileinf_timer -= diff; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp index f923657460..d3f724ad53 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp @@ -428,7 +428,8 @@ class boss_zuljin : public CreatureScript { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { - TankGUID = me->EnsureVictim()->GetGUID(); + if (me->GetVictim()) + TankGUID = me->EnsureVictim()->GetGUID(); me->SetSpeed(MOVE_RUN, 5.0f); AttackStart(target); // change victim Claw_Rage_Timer = 0; diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp index 0af42f5af2..04e5f03158 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp @@ -156,9 +156,12 @@ class boss_ayamiss : public CreatureScript _phase = PHASE_GROUND; SetCombatMovement(true); me->SetCanFly(false); - Position VictimPos; - me->EnsureVictim()->GetPosition(&VictimPos); - me->GetMotionMaster()->MovePoint(POINT_GROUND, VictimPos); + if (me->GetVictim()) + { + Position VictimPos; + me->EnsureVictim()->GetPosition(&VictimPos); + me->GetMotionMaster()->MovePoint(POINT_GROUND, VictimPos); + } DoResetThreat(); events.ScheduleEvent(EVENT_LASH, urand(5000, 8000)); events.ScheduleEvent(EVENT_TRASH, urand(3000, 6000)); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp index 7038dd0df4..20100dfc5d 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp @@ -272,7 +272,8 @@ class npc_glob_of_viscidus : public CreatureScript if (Viscidus->IsAlive() && Viscidus->GetHealthPct() < 5.0f) { Viscidus->SetVisible(true); - Viscidus->EnsureVictim()->Kill(Viscidus); + if (Viscidus->GetVictim()) + Viscidus->EnsureVictim()->Kill(Viscidus); } else { diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp index 680caa6288..013e609945 100644 --- a/src/server/scripts/Kalimdor/zone_tanaris.cpp +++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp @@ -123,7 +123,7 @@ public: { if (SendItemTimer <= diff) { - if (me->EnsureVictim()->GetTypeId() == TYPEID_PLAYER) + if (me->GetVictim() && me->EnsureVictim()->GetTypeId() == TYPEID_PLAYER) SendItem(me->GetVictim()); SendItemTimer = 5000; } else SendItemTimer -= diff; diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp index 2803cccead..0a2ebb549f 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp @@ -230,11 +230,14 @@ class boss_urom : public CreatureScript { if (arcaneExplosionTimer <= diff) { - Position pos; - me->EnsureVictim()->GetPosition(&pos); + if (me->GetVictim()) + { + Position pos; + me->EnsureVictim()->GetPosition(&pos); - me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); - me->GetMotionMaster()->MoveChase(me->GetVictim()); + me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + } me->SetWalk(true); Talk(EMOTE_ARCANE_EXPLOSION); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index c199fe9e9e..ce6e99401a 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -199,7 +199,10 @@ class npc_flash_freeze : public CreatureScript void UpdateAI(uint32 diff) OVERRIDE { - if (!UpdateVictim() || me->EnsureVictim()->HasAura(SPELL_BLOCK_OF_ICE) || me->EnsureVictim()->HasAura(SPELL_FLASH_FREEZE_HELPER)) + if (!UpdateVictim() + || !me->GetVictim() + || me->EnsureVictim()->HasAura(SPELL_BLOCK_OF_ICE) + || me->EnsureVictim()->HasAura(SPELL_FLASH_FREEZE_HELPER)) return; if (me->EnsureVictim()->GetGUID() != targetGUID || instance->GetBossState(BOSS_HODIR) != IN_PROGRESS) diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 957471216d..b3d59c390c 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -2074,7 +2074,7 @@ public: void UpdateAI(uint32 /*diff*/) OVERRIDE { - if (!UpdateVictim()) + if (!UpdateVictim() || !me->GetVictim()) return; if (me->EnsureVictim()->GetTypeId() != TYPEID_PLAYER) diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index d86d94088d..ed742a56ec 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -668,7 +668,7 @@ public: void UpdateAI(uint32 diff) OVERRIDE { //Return since we have no target - if (!UpdateVictim()) + if (!UpdateVictim() || !me->GetVictim()) return; if (!CheckedAggro) diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp index 490bfaa16f..3cb9ca2659 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp @@ -626,7 +626,8 @@ public: { DoCastVictim(SPELL_TIDAL_SURGE); // Hacky way to do it - won't trigger elseways - me->EnsureVictim()->CastSpell(me->GetVictim(), SPELL_TIDAL_SURGE_FREEZE, true); + if (me->GetVictim()) + me->EnsureVictim()->CastSpell(me->GetVictim(), SPELL_TIDAL_SURGE_FREEZE, true); TidalSurge_Timer = 15000+rand()%5000; } else TidalSurge_Timer -= diff; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp index 73da4f62a2..4df431b91a 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp @@ -135,7 +135,7 @@ public: void UpdateAI(uint32 diff) OVERRIDE { //Return since we have no target - if (!UpdateVictim()) + if (!UpdateVictim() || !me->GetVictim()) return; if (me->EnsureVictim()->GetGUID() != victimGUID) diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp index 500bcd1ed8..78a7d71732 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp @@ -93,7 +93,7 @@ class npc_warp_splinter_treant : public CreatureScript void UpdateAI(uint32 diff) OVERRIDE { - if (!UpdateVictim()) + if (!UpdateVictim() || !me->GetVictim()) { if (WarpGuid && check_Timer <= diff) { @@ -115,7 +115,7 @@ class npc_warp_splinter_treant : public CreatureScript return; } - if (me->EnsureVictim()->GetGUID() != WarpGuid) + if (me->EnsureVictim()->GetGUID() != WarpGuid) DoMeleeAttackIfReady(); } }; diff --git a/src/server/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp index c8dfc582bb..87458fdc4d 100644 --- a/src/server/scripts/Pet/pet_hunter.cpp +++ b/src/server/scripts/Pet/pet_hunter.cpp @@ -93,7 +93,7 @@ class npc_pet_hunter_snake_trap : public CreatureScript void UpdateAI(uint32 diff) OVERRIDE { - if (!UpdateVictim()) + if (!UpdateVictim() || !me->GetVictim()) return; if (me->EnsureVictim()->HasBreakableByDamageCrowdControlAura(me))