aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQAston <qaston@gmail.com>2011-02-04 03:14:01 +0100
committerQAston <qaston@gmail.com>2011-02-04 03:14:01 +0100
commite9bae2d0a0fc45b6376581f2395ffa87fb9d9a99 (patch)
treeded98ab2f66417407941282b13d9e1ccf555693c
parentf862db8b9291f03030b52d08c8ba144c1171da9d (diff)
Core/Auras: Prevent possible crash on SPELL_AURA_DAMAGE_SHIELD aura handler.
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 69c88241859..e143ac0c8f1 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -1390,8 +1390,10 @@ void Unit::DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
// Do effect if any damage done to target
if (damageInfo->damage)
{
- AuraEffectList const& vDamageShields = pVictim->GetAuraEffectsByType(SPELL_AURA_DAMAGE_SHIELD);
- for (AuraEffectList::const_iterator dmgShieldItr = vDamageShields.begin(); dmgShieldItr != vDamageShields.end(); ++dmgShieldItr)
+ // We're going to call functions which can modify content of the list during iteration over it's elements
+ // Let's copy the list so we can prevent iterator invalidation
+ AuraEffectList vDamageShieldsCopy(pVictim->GetAuraEffectsByType(SPELL_AURA_DAMAGE_SHIELD));
+ for (AuraEffectList::const_iterator dmgShieldItr = vDamageShieldsCopy.begin(); dmgShieldItr != vDamageShieldsCopy.end(); ++dmgShieldItr)
{
SpellEntry const *i_spellProto = (*dmgShieldItr)->GetSpellProto();
// Damage shield can be resisted...