diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-09-22 13:17:08 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-09-22 13:17:08 +0200 |
| commit | 723e638a84d2aebe8a41fc39ba94f1a04138797e (patch) | |
| tree | 691e6c1614462e5fcce4b05d674cba38edd3f748 /src/server/game/Entities/Player | |
| parent | 7eb3189a8046d35de997a24feabab7bf2f156fe0 (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.cpp | 12 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 |
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); |
