sc/source/filter/xml/xmlfonte.cxx | 85 +++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 32 deletions(-)
New commits: commit 30704655570ea2b4c6943e18de02497284b2174c Author: Armin Le Grand <a...@apache.org> Date: Fri Jun 29 08:28:49 2012 +0000 Related: #i120077# Added local var for SfxItemPool for EditEngine to avoid a memory leak. Found by: Chao Huang Patch by: Chao Huang, alg Review by: Chao Huang, alg (cherry picked from commit e7168710bfd30b5d682d21d81c116cd33cf22505) Conflicts: sc/source/filter/xml/xmlfonte.cxx Change-Id: I75475bb59b3a7040938826d095dcd81e19d61b46 diff --git a/sc/source/filter/xml/xmlfonte.cxx b/sc/source/filter/xml/xmlfonte.cxx index 9b0c263..50296ba 100644 --- a/sc/source/filter/xml/xmlfonte.cxx +++ b/sc/source/filter/xml/xmlfonte.cxx @@ -32,11 +32,15 @@ class ScXMLFontAutoStylePool_Impl: public XMLFontAutoStylePool { +private: + // #i120077# remember owned pool + SfxItemPool* mpEditEnginePool; + void AddFontItems(sal_uInt16* pWhichIds, sal_uInt8 nIdCount, const SfxItemPool* pItemPool, const sal_Bool bExportDefaults); - public: +public: ScXMLFontAutoStylePool_Impl( ScXMLExport& rExport, bool bBlockFontEmbedding ); - + virtual ~ScXMLFontAutoStylePool_Impl(); }; void ScXMLFontAutoStylePool_Impl::AddFontItems(sal_uInt16* pWhichIds, sal_uInt8 nIdCount, const SfxItemPool* pItemPool, const sal_Bool bExportDefaults) @@ -66,9 +70,9 @@ void ScXMLFontAutoStylePool_Impl::AddFontItems(sal_uInt16* pWhichIds, sal_uInt8 } } -ScXMLFontAutoStylePool_Impl::ScXMLFontAutoStylePool_Impl( - ScXMLExport& rExportP, bool bBlockFontEmbedding ) : - XMLFontAutoStylePool( rExportP, bBlockFontEmbedding ) +ScXMLFontAutoStylePool_Impl::ScXMLFontAutoStylePool_Impl(ScXMLExport& rExportP, bool bBlockFontEmbedding) + : XMLFontAutoStylePool(rExportP, bBlockFontEmbedding) + , mpEditEnginePool(NULL) { sal_uInt16 aWhichIds[3] = { ATTR_FONT, ATTR_CJK_FONT, ATTR_CTL_FONT }; @@ -92,46 +96,63 @@ ScXMLFontAutoStylePool_Impl::ScXMLFontAutoStylePool_Impl( if(pItr) { SfxStyleSheetBase* pStyle(pItr->First()); - SfxItemPool* pPageEditPool(EditEngine::CreatePool()); - EditEngine aEditEngine(pPageEditPool); - while (pStyle) + + if(pStyle) { - const SfxItemPool& rPagePool(pStyle->GetPool().GetPool()); - for (sal_uInt8 j = 0; j < 4; ++j) + // #i120077# remember the SfxItemPool in member variable before usage. The + // local EditEngine will not take over ownership of the pool. + mpEditEnginePool = EditEngine::CreatePool(); + EditEngine aEditEngine(mpEditEnginePool); + + while (pStyle) { - sal_uInt16 nPageWhichId(aPageWhichIds[j]); - sal_uInt32 nPageHFItems(rPagePool.GetItemCount2(nPageWhichId)); - const ScPageHFItem* pPageItem; - for (sal_uInt32 k = 0; k < nPageHFItems; ++k) + const SfxItemPool& rPagePool(pStyle->GetPool().GetPool()); + + for (sal_uInt8 j = 0; j < 4; ++j) { - if (0 != (pPageItem = static_cast<const ScPageHFItem*>(rPagePool.GetItem2(nPageWhichId, k)))) + sal_uInt16 nPageWhichId(aPageWhichIds[j]); + sal_uInt32 nPageHFItems(rPagePool.GetItemCount2(nPageWhichId)); + const ScPageHFItem* pPageItem; + for (sal_uInt32 k = 0; k < nPageHFItems; ++k) { - const EditTextObject* pLeftArea(pPageItem->GetLeftArea()); - if (pLeftArea) - { - aEditEngine.SetText(*pLeftArea); - AddFontItems(aEditWhichIds, 3, pPageEditPool, false); - } - const EditTextObject* pCenterArea(pPageItem->GetCenterArea()); - if (pCenterArea) + if (0 != (pPageItem = static_cast<const ScPageHFItem*>(rPagePool.GetItem2(nPageWhichId, k)))) { - aEditEngine.SetText(*pCenterArea); - AddFontItems(aEditWhichIds, 3, pPageEditPool, false); - } - const EditTextObject* pRightArea(pPageItem->GetRightArea()); - if (pRightArea) - { - aEditEngine.SetText(*pRightArea); - AddFontItems(aEditWhichIds, 3, pPageEditPool, false); + const EditTextObject* pLeftArea(pPageItem->GetLeftArea()); + if (pLeftArea) + { + aEditEngine.SetText(*pLeftArea); + AddFontItems(aEditWhichIds, 3, mpEditEnginePool, false); + } + const EditTextObject* pCenterArea(pPageItem->GetCenterArea()); + if (pCenterArea) + { + aEditEngine.SetText(*pCenterArea); + AddFontItems(aEditWhichIds, 3, mpEditEnginePool, false); + } + const EditTextObject* pRightArea(pPageItem->GetRightArea()); + if (pRightArea) + { + aEditEngine.SetText(*pRightArea); + AddFontItems(aEditWhichIds, 3, mpEditEnginePool, false); + } } } } + + pStyle = pItr->Next(); } - pStyle = pItr->Next(); } } } +ScXMLFontAutoStylePool_Impl::~ScXMLFontAutoStylePool_Impl() +{ + if(mpEditEnginePool) + { + // memory leak #i120077# + SfxItemPool::Free(mpEditEnginePool); + } +} XMLFontAutoStylePool* ScXMLExport::CreateFontAutoStylePool() { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits