From b35aa105792b1f14a4f39804ce278d695a2b6c23 Mon Sep 17 00:00:00 2001 From: lhofhansl Date: Fri, 28 Apr 2023 11:17:48 -0700 Subject: [PATCH] Guarantee ActiveObjectMgr::m_active_object is not modified while iterating (#13468) Currently if a mod creates new active objects in on_deactivate the server could crash. --- src/server/activeobjectmgr.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/server/activeobjectmgr.cpp b/src/server/activeobjectmgr.cpp index acd6611f4..1fa191ac0 100644 --- a/src/server/activeobjectmgr.cpp +++ b/src/server/activeobjectmgr.cpp @@ -27,17 +27,15 @@ namespace server void ActiveObjectMgr::clear(const std::function &cb) { - std::vector objects_to_remove; - for (auto &it : m_active_objects) { - if (cb(it.second, it.first)) { - // Id to be removed from m_active_objects - objects_to_remove.push_back(it.first); - } - } + // make a defensive copy in case the + // passed callback changes the set of active objects + auto cloned_map(m_active_objects); - // Remove references from m_active_objects - for (u16 i : objects_to_remove) { - m_active_objects.erase(i); + for (auto &it : cloned_map) { + if (cb(it.second, it.first)) { + // Remove reference from m_active_objects + m_active_objects.erase(it.first); + } } }