aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Player
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-09-22 13:17:08 +0200
committerShauren <shauren.trinity@gmail.com>2024-09-22 13:17:08 +0200
commit723e638a84d2aebe8a41fc39ba94f1a04138797e (patch)
tree691e6c1614462e5fcce4b05d674cba38edd3f748 /src/server/game/Entities/Player
parent7eb3189a8046d35de997a24feabab7bf2f156fe0 (diff)
Core/Spells: Protect against stack overflows in spell override handling
Diffstat (limited to 'src/server/game/Entities/Player')
-rw-r--r--src/server/game/Entities/Player/Player.cpp12
-rw-r--r--src/server/game/Entities/Player/Player.h2
2 files changed, 8 insertions, 6 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index ff98f642fc0..46e357e9b60 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -30035,15 +30035,16 @@ Difficulty Player::CheckLoadedLegacyRaidDifficultyID(Difficulty difficulty)
return difficulty;
}
-SpellInfo const* Player::GetCastSpellInfo(SpellInfo const* spellInfo, TriggerCastFlags& triggerFlag) const
+SpellInfo const* Player::GetCastSpellInfo(SpellInfo const* spellInfo, TriggerCastFlags& triggerFlag, GetCastSpellInfoContext* context) const
{
auto overrides = m_overrideSpells.find(spellInfo->Id);
if (overrides != m_overrideSpells.end())
for (uint32 spellId : overrides->second)
- if (SpellInfo const* newInfo = sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID()))
- return GetCastSpellInfo(newInfo, triggerFlag);
+ if (context->AddSpell(spellId))
+ if (SpellInfo const* newInfo = sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID()))
+ return GetCastSpellInfo(newInfo, triggerFlag, context);
- return Unit::GetCastSpellInfo(spellInfo, triggerFlag);
+ return Unit::GetCastSpellInfo(spellInfo, triggerFlag, context);
}
void Player::AddOverrideSpell(uint32 overridenSpellId, uint32 newSpellId)
@@ -30671,7 +30672,8 @@ void Player::ExecutePendingSpellCastRequest()
}
// Check possible spell cast overrides
- spellInfo = castingUnit->GetCastSpellInfo(spellInfo, triggerFlag);
+ GetCastSpellInfoContext overrideContext;
+ spellInfo = castingUnit->GetCastSpellInfo(spellInfo, triggerFlag, &overrideContext);
if (spellInfo->IsPassive())
{
CancelPendingCastRequest();
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 5dbc2e8c305..957bf84d891 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1872,7 +1872,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void SendRemoveControlBar() const;
bool HasSpell(uint32 spell) const override;
bool HasActiveSpell(uint32 spell) const; // show in spellbook
- SpellInfo const* GetCastSpellInfo(SpellInfo const* spellInfo, TriggerCastFlags& triggerFlag) const override;
+ SpellInfo const* GetCastSpellInfo(SpellInfo const* spellInfo, TriggerCastFlags& triggerFlag, GetCastSpellInfoContext* context) const override;
bool IsSpellFitByClassAndRace(uint32 spell_id) const;
bool HandlePassiveSpellLearn(SpellInfo const* spellInfo);