From ebccd69b2f236987d68095fbed9f20c1650ae4ca Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Mon, 9 Mar 2009 05:44:49 +0300 Subject: [PATCH] [7417] Fixed crash at access by unexpected NULL pointer in quest templates map. Never never use operator[] for _access_ to elements std::map. --- src/game/ObjectMgr.cpp | 16 ++++++++++------ src/shared/revision_nr.h | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index df059e4da..9e296453e 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -3282,14 +3282,15 @@ void ObjectMgr::LoadQuests() if(qinfo->NextQuestInChain) { - if(mQuestTemplates.find(qinfo->NextQuestInChain) == mQuestTemplates.end()) + QuestMap::iterator qNextItr = mQuestTemplates.find(qinfo->NextQuestInChain); + if(qNextItr == mQuestTemplates.end()) { sLog.outErrorDb("Quest %u has `NextQuestInChain` = %u but quest %u does not exist, quest chain will not work.", qinfo->GetQuestId(),qinfo->NextQuestInChain ,qinfo->NextQuestInChain ); qinfo->NextQuestInChain = 0; } else - mQuestTemplates[qinfo->NextQuestInChain]->prevChainQuests.push_back(qinfo->GetQuestId()); + qNextItr->second->prevChainQuests.push_back(qinfo->GetQuestId()); } // fill additional data stores @@ -3307,14 +3308,15 @@ void ObjectMgr::LoadQuests() if(qinfo->NextQuestId) { - if (mQuestTemplates.find(abs(qinfo->GetNextQuestId())) == mQuestTemplates.end()) + QuestMap::iterator qNextItr = mQuestTemplates.find(abs(qinfo->GetNextQuestId())); + if (qNextItr == mQuestTemplates.end()) { sLog.outErrorDb("Quest %d has NextQuestId %i, but no such quest", qinfo->GetQuestId(), qinfo->GetNextQuestId()); } else { int32 signedQuestId = qinfo->NextQuestId < 0 ? -int32(qinfo->GetQuestId()) : int32(qinfo->GetQuestId()); - mQuestTemplates[abs(qinfo->GetNextQuestId())]->prevQuests.push_back(signedQuestId); + qNextItr->second->prevQuests.push_back(signedQuestId); } } @@ -4949,7 +4951,8 @@ void ObjectMgr::LoadAreaTriggerTeleports() if(at.requiredQuest) { - if(!mQuestTemplates[at.requiredQuest]) + QuestMap::iterator qReqItr = mQuestTemplates.find(at.requiredQuest); + if(qReqItr != mQuestTemplates.end()) { sLog.outErrorDb("Required Quest %u not exist for trigger %u, remove quest done requirement.",at.requiredQuest,Trigger_ID); at.requiredQuest = 0; @@ -4958,7 +4961,8 @@ void ObjectMgr::LoadAreaTriggerTeleports() if(at.requiredQuestHeroic) { - if(!mQuestTemplates[at.requiredQuestHeroic]) + QuestMap::iterator qReqItr = mQuestTemplates.find(at.requiredQuestHeroic); + if(qReqItr != mQuestTemplates.end()) { sLog.outErrorDb("Required Quest %u not exist for trigger %u, remove quest done requirement.",at.requiredQuestHeroic,Trigger_ID); at.requiredQuestHeroic = 0; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 25a6661fb..278a8f916 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7416" + #define REVISION_NR "7417" #endif // __REVISION_NR_H__