From 6e5369da3a31bfc7b2fd7723682acc1f091cb0ae Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 16 Jan 2019 00:35:34 +0100 Subject: [PATCH] fix possible double destruction when removing a group and its content from document --- src/App/GroupExtension.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/App/GroupExtension.cpp b/src/App/GroupExtension.cpp index db76dc4709..1d2e677876 100644 --- a/src/App/GroupExtension.cpp +++ b/src/App/GroupExtension.cpp @@ -141,6 +141,15 @@ std::vector< DocumentObject* > GroupExtension::removeObjects(std::vector< Docume void GroupExtension::removeObjectsFromDocument() { +#if 1 + while (Group.getSize() > 0) { + // Remove the objects step by step because it can happen + // that an object is part of several groups and thus a + // double destruction could be possible + const std::vector & grp = Group.getValues(); + removeObjectFromDocument(grp.front()); + } +#else const std::vector & grp = Group.getValues(); // Use set so iterate on each linked object exactly one time (in case of multiple links to the same document) std::set grpSet (grp.begin(), grp.end()); @@ -148,10 +157,15 @@ void GroupExtension::removeObjectsFromDocument() for (std::set::iterator it = grpSet.begin(); it != grpSet.end(); ++it) { removeObjectFromDocument(*it); } +#endif } void GroupExtension::removeObjectFromDocument(DocumentObject* obj) { + // check that object is not invalid + if (!obj || !obj->getNameInDocument()) + return; + // remove all children if (obj->hasExtension(GroupExtension::getExtensionClassTypeId())) { GroupExtension *grp = static_cast(obj->getExtension(GroupExtension::getExtensionClassTypeId()));