From 36a6d04156214b207d7b1f286ff8f365c733a557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francesco=20Borz=C3=AC?= Date: Sun, 20 Jun 2021 19:52:44 +0200 Subject: [PATCH] fix(Core): check spell info and prevent crash (#6454) --- src/server/game/Entities/Player/Player.cpp | 6 +++++- src/server/game/Spells/SpellMgr.h | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1eb9cdd13..e51b1e145 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4417,7 +4417,11 @@ void Player::RemoveArenaSpellCooldowns(bool removeActivePetCooldowns) { next = itr; ++next; - SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(itr->first); + SpellInfo const* spellInfo = sSpellMgr->CheckSpellInfo(itr->first); + if (!spellInfo) + { + continue; + } if (spellInfo->HasAttribute(SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS)) RemoveSpellCooldown(itr->first, true); diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index e51b2e38e..4241e58ce 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -10,6 +10,7 @@ // For static or at-server-startup loaded spell data #include "Common.h" +#include "Log.h" #include "SharedDefines.h" #include "Unit.h" @@ -692,6 +693,22 @@ public: ASSERT(spellInfo); return spellInfo; } + // use this instead of AssertSpellInfo to have the problem logged instead of crashing the server + SpellInfo const* CheckSpellInfo(uint32 spellId) const + { + if (spellId >= GetSpellInfoStoreSize()) + { + LOG_ERROR("server", "spellId %u is not lower than GetSpellInfoStoreSize() (%u)", spellId, GetSpellInfoStoreSize()); + return nullptr; + } + SpellInfo const* spellInfo = mSpellInfoMap[spellId]; + if (!spellInfo) + { + LOG_ERROR("server", "spellId %u has invalid spellInfo", spellId); + return nullptr; + } + return spellInfo; + } [[nodiscard]] uint32 GetSpellInfoStoreSize() const { return mSpellInfoMap.size(); } // Talent Additional Set