From 0329d32b49e3064e4612c0fadd63acfe6593a280 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Thu, 12 Jan 2023 14:12:23 +0100 Subject: [PATCH] more cleanup --- src/fsfw/events/eventmatching/EventMatchTree.cpp | 1 - src/fsfw/objectmanager/ObjectManager.cpp | 11 ++++++++--- src/fsfw/objectmanager/ObjectManager.h | 3 +++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/fsfw/events/eventmatching/EventMatchTree.cpp b/src/fsfw/events/eventmatching/EventMatchTree.cpp index f60ddea27..6d7f20122 100644 --- a/src/fsfw/events/eventmatching/EventMatchTree.cpp +++ b/src/fsfw/events/eventmatching/EventMatchTree.cpp @@ -9,7 +9,6 @@ EventMatchTree::EventMatchTree(StorageManagerIF* storageBackend, bool invertedMa : MatchTree(end(), 1), factory(storageBackend), invertedMatch(invertedMatch) { } -#include EventMatchTree::~EventMatchTree() {} bool EventMatchTree::match(EventMessage* number) { diff --git a/src/fsfw/objectmanager/ObjectManager.cpp b/src/fsfw/objectmanager/ObjectManager.cpp index 53c172c8d..29c1b2fcc 100644 --- a/src/fsfw/objectmanager/ObjectManager.cpp +++ b/src/fsfw/objectmanager/ObjectManager.cpp @@ -31,10 +31,9 @@ void ObjectManager::clear() { } ObjectManager::~ObjectManager() { - auto iter = objectList.begin(); - while (iter != objectList.end()) { + teardown = true; + for (auto iter = objectList.begin(); iter != objectList.end(); iter = objectList.erase(iter)) { delete iter->second; - iter = objectList.begin(); } } @@ -62,6 +61,12 @@ ReturnValue_t ObjectManager::insert(object_id_t id, SystemObjectIF* object) { } ReturnValue_t ObjectManager::remove(object_id_t id) { + // this function is called during destruction of System Objects + // disabeld for teardown to avoid iterator invalidation and + // double free + if (teardown) { + return returnvalue::OK; + } if (this->getSystemObject(id) != nullptr) { this->objectList.erase(id); #if FSFW_CPP_OSTREAM_ENABLED == 1 diff --git a/src/fsfw/objectmanager/ObjectManager.h b/src/fsfw/objectmanager/ObjectManager.h index 079620435..017fe6755 100644 --- a/src/fsfw/objectmanager/ObjectManager.h +++ b/src/fsfw/objectmanager/ObjectManager.h @@ -71,6 +71,9 @@ class ObjectManager : public ObjectManagerIF { */ std::map objectList; static ObjectManager* objManagerInstance; + // used when the OM itself is deleted to modify behaviour of remove() + // to avoid iterator invalidation and double free + bool teardown = false; }; // Documentation can be found in the class method declaration above