From ee1c1b97be4492ecabe8b15ea6323fc37e4eaa8c Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 14 May 2015 00:04:49 +0200 Subject: Core/Maps: Fixed invalid iterator usage Closes #14687 --- src/server/game/Events/GameEventMgr.cpp | 17 +++++++++++++---- src/server/game/OutdoorPvP/OutdoorPvP.cpp | 18 +++++++++++------- src/server/game/Pools/PoolMgr.cpp | 16 ++++++++++++---- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index ba247dbd19e..0d6b971ec15 100644 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -1266,8 +1266,12 @@ void GameEventMgr::GameEventUnspawn(int16 event_id) sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr](Map* map) { auto creatureBounds = map->GetCreatureBySpawnIdStore().equal_range(*itr); - for (auto itr = creatureBounds.first; itr != creatureBounds.second; ++itr) - itr->second->AddObjectToRemoveList(); + for (auto itr2 = creatureBounds.first; itr2 != creatureBounds.second;) + { + Creature* creature = itr2->second; + ++itr2; + creature->AddObjectToRemoveList(); + } }); } } @@ -1292,11 +1296,16 @@ void GameEventMgr::GameEventUnspawn(int16 event_id) sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr](Map* map) { auto gameobjectBounds = map->GetGameObjectBySpawnIdStore().equal_range(*itr); - for (auto itr = gameobjectBounds.first; itr != gameobjectBounds.second; ++itr) - itr->second->AddObjectToRemoveList(); + for (auto itr2 = gameobjectBounds.first; itr2 != gameobjectBounds.second;) + { + GameObject* go = itr2->second; + ++itr2; + go->AddObjectToRemoveList(); + } }); } } + if (internal_event_id < 0 || internal_event_id >= int32(mGameEventPoolIds.size())) { TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventPoolIds element %u (size: %zu)", internal_event_id, mGameEventPoolIds.size()); diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 0343e92c506..117891140da 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -162,12 +162,14 @@ bool OPvPCapturePoint::DelCreature(uint32 type) } auto bounds = m_PvP->GetMap()->GetCreatureBySpawnIdStore().equal_range(spawnId); - for (auto itr = bounds.first; itr != bounds.second; ++itr) + for (auto itr = bounds.first; itr != bounds.second;) { + Creature* c = itr->second; + ++itr; // Don't save respawn time - itr->second->SetRespawnTime(0); - itr->second->RemoveCorpse(); - itr->second->AddObjectToRemoveList(); + c->SetRespawnTime(0); + c->RemoveCorpse(); + c->AddObjectToRemoveList(); } TC_LOG_DEBUG("outdoorpvp", "deleting opvp creature type %u", type); @@ -196,11 +198,13 @@ bool OPvPCapturePoint::DelObject(uint32 type) ObjectGuid::LowType spawnId = m_Objects[type]; auto bounds = m_PvP->GetMap()->GetGameObjectBySpawnIdStore().equal_range(spawnId); - for (auto itr = bounds.first; itr != bounds.second; ++itr) + for (auto itr = bounds.first; itr != bounds.second;) { + GameObject* go = itr->second; + ++itr; // Don't save respawn time - itr->second->SetRespawnTime(0); - itr->second->Delete(); + go->SetRespawnTime(0); + go->Delete(); } sObjectMgr->DeleteGOData(spawnId); diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp index 15f378e138a..a82652d2f03 100644 --- a/src/server/game/Pools/PoolMgr.cpp +++ b/src/server/game/Pools/PoolMgr.cpp @@ -225,8 +225,12 @@ void PoolGroup::Despawn1Object(uint64 guid) if (!map->Instanceable()) { auto creatureBounds = map->GetCreatureBySpawnIdStore().equal_range(guid); - for (auto itr = creatureBounds.first; itr != creatureBounds.second; ++itr) - itr->second->AddObjectToRemoveList(); + for (auto itr = creatureBounds.first; itr != creatureBounds.second;) + { + Creature* creature = itr->second; + ++itr; + creature->AddObjectToRemoveList(); + } } } } @@ -243,8 +247,12 @@ void PoolGroup::Despawn1Object(uint64 guid) if (!map->Instanceable()) { auto gameobjectBounds = map->GetGameObjectBySpawnIdStore().equal_range(guid); - for (auto itr = gameobjectBounds.first; itr != gameobjectBounds.second; ++itr) - itr->second->AddObjectToRemoveList(); + for (auto itr = gameobjectBounds.first; itr != gameobjectBounds.second;) + { + GameObject* go = itr->second; + ++itr; + go->AddObjectToRemoveList(); + } } } } -- cgit v1.2.3