diff options
author | Mark Wielaard <mark@klomp.org> | 2013-05-21 09:55:03 +0200 |
---|---|---|
committer | Fridrich Strba <fridrich@documentfoundation.org> | 2013-05-21 09:41:32 +0000 |
commit | a6a8c379b20b4de7e8715057af4c1f6d020e55d2 (patch) | |
tree | aa36759096647d9cd26a89e0a9668f33cd1bfb6e | |
parent | 3661c3eb0124d6f4799fe7c4393d4576e1613bfb (diff) |
Fix two SfxFilterMatcher_Impl memory leaks.
First SfxFilterMatcher_Impl::InitForIterating() will set pList to either
the global filter array matcher pFilterArr, or to a new SfxFilterList_Impl.
This new SfxFilterList_Impl should be deleted in the destructor.
Second getSfxFilterMatcher_Impl() keeps a cache of SfxFilterMatcher_Impls.
If a SfxFilterMatcher_Impl for a given name doesn't exist yet a new one
will be created. But the cache stored objects by service name (aName), but
looked object up by factory name (rName). So it always created a new
SfxFilterMatcher_Impl instead of using the one from the aImplArr cache.
Change-Id: I7840aaddc861f609fbe14d5b6c0ea20d997f690f
Reviewed-on: https://gerrit.libreoffice.org/3989
Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org>
Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
-rw-r--r-- | sfx2/source/bastyp/fltfnc.cxx | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/sfx2/source/bastyp/fltfnc.cxx b/sfx2/source/bastyp/fltfnc.cxx index 8d9a70c744b3..42477d09916f 100644 --- a/sfx2/source/bastyp/fltfnc.cxx +++ b/sfx2/source/bastyp/fltfnc.cxx @@ -255,6 +255,14 @@ public: , pList(0) { } + ~SfxFilterMatcher_Impl() + { + // SfxFilterMatcher_Impl::InitForIterating() will set pList to + // either the global filter array matcher pFilterArr, or to + // a new SfxFilterList_Impl. + if (pList != pFilterArr) + delete pList; + } }; namespace @@ -287,7 +295,7 @@ namespace // previously SfxFilterMatcherArr_Impl::iterator aEnd = aImplArr.end(); SfxFilterMatcherArr_Impl::iterator aIter = - std::find_if(aImplArr.begin(), aEnd, hasName(rName)); + std::find_if(aImplArr.begin(), aEnd, hasName(aName)); if (aIter != aEnd) return *aIter; |