[Libreoffice-commits] core.git: svx/source
Mike Kaganski (via logerrit)
logerrit at kemper.freedesktop.org
Thu Aug 19 13:11:02 UTC 2021
svx/source/svdraw/svdmodel.cxx | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
New commits:
commit 958854ac4c701e6b1444178514b1a6e4e03be94e
Author: Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Thu Aug 19 13:46:21 2021 +0200
Commit: Mike Kaganski <mike.kaganski at collabora.com>
CommitDate: Thu Aug 19 15:10:28 2021 +0200
Avoid infinite loop in dbgutil builds
As mentioned in tdf#117162 comment 13, there are cases when
SdrObject::Free does not modify maAllIncarnatedObjects. So the
fix for tdf#143514 needs the change to account for that.
Change-Id: I249c6a3b095c5d3c644dcb1bbc900b42793ea820
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120648
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>
diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx
index 7dcc8110faa4..a6f4aeed9ec0 100644
--- a/svx/source/svdraw/svdmodel.cxx
+++ b/svx/source/svdraw/svdmodel.cxx
@@ -197,13 +197,16 @@ SdrModel::~SdrModel()
if(!maAllIncarnatedObjects.empty())
{
SAL_WARN("svx","SdrModel::~SdrModel: Not all incarnations of SdrObjects deleted, possible memory leak (!)");
- // calling SdrObject::Free will change maAllIncarnatedObjects, and potentially remove more
- // than one - do not copy to another container, to not try to free already removed object.
- do
+ const std::vector<const SdrObject*> maRemainingObjects(maAllIncarnatedObjects.begin(),
+ maAllIncarnatedObjects.end());
+ for (auto pSdrObject : maRemainingObjects)
{
- SdrObject* pCandidate(const_cast<SdrObject*>(*maAllIncarnatedObjects.begin()));
- SdrObject::Free(pCandidate);
- } while (!maAllIncarnatedObjects.empty());
+ SdrObject* pCandidate(const_cast<SdrObject*>(pSdrObject));
+ // calling SdrObject::Free will change maAllIncarnatedObjects, and potentially remove
+ // more than one, so check if the candidate is still in the updated list before Free
+ if (maAllIncarnatedObjects.find(pSdrObject) != maAllIncarnatedObjects.end())
+ SdrObject::Free(pCandidate);
+ }
}
#endif
More information about the Libreoffice-commits
mailing list