From 260bfa5e4913c4ecb5720f3ef5163333374de744 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Tue, 7 Mar 2017 13:26:51 +0000 Subject: ofz: fix ppt import leak Change-Id: I48b855f96464c74b76b473d5674fcdcc8388bf1b --- filter/source/msfilter/svdfppt.cxx | 56 +++++++++++++++++-------------------- include/filter/msfilter/svdfppt.hxx | 13 ++++++--- 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx index 9b941379fff3..cb2fceb430a7 100644 --- a/filter/source/msfilter/svdfppt.cxx +++ b/filter/source/msfilter/svdfppt.cxx @@ -6399,10 +6399,7 @@ PPTPortionObj* PPTParagraphObj::Next() PPTFieldEntry::~PPTFieldEntry() { - delete pField1; - delete pField2; - delete pString; -}; +} void PPTFieldEntry::GetDateTime( const sal_uInt32 nVal, SvxDateFormat& eDateFormat, SvxTimeFormat& eTimeFormat ) { @@ -6453,14 +6450,14 @@ void PPTFieldEntry::SetDateTime( sal_uInt32 nVal ) SvxTimeFormat eTimeFormat; GetDateTime( nVal, eDateFormat, eTimeFormat ); if ( eDateFormat != SVXDATEFORMAT_APPDEFAULT ) - pField1 = new SvxFieldItem( SvxDateField( Date( Date::SYSTEM ), SVXDATETYPE_VAR, eDateFormat ), EE_FEATURE_FIELD ); + xField1.reset(new SvxFieldItem(SvxDateField( Date( Date::SYSTEM ), SVXDATETYPE_VAR, eDateFormat ), EE_FEATURE_FIELD)); if ( eTimeFormat != SVXTIMEFORMAT_APPDEFAULT ) { - SvxFieldItem* pFieldItem = new SvxFieldItem( SvxExtTimeField( tools::Time( tools::Time::SYSTEM ), SVXTIMETYPE_VAR, eTimeFormat ), EE_FEATURE_FIELD ); - if ( pField1 ) - pField2 = pFieldItem; + std::unique_ptr xFieldItem(new SvxFieldItem(SvxExtTimeField( tools::Time( tools::Time::SYSTEM ), SVXTIMETYPE_VAR, eTimeFormat ), EE_FEATURE_FIELD)); + if (xField1) + xField2 = std::move(xFieldItem); else - pField1 = pFieldItem; + xField1 = std::move(xFieldItem); } } @@ -6763,7 +6760,7 @@ PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport { xEntry.reset(new PPTFieldEntry); rIn.ReadUInt16(xEntry->nPos); - xEntry->pField1 = new SvxFieldItem( SvxFooterField(), EE_FEATURE_FIELD ); + xEntry->xField1.reset(new SvxFieldItem(SvxFooterField(), EE_FEATURE_FIELD)); } break; @@ -6771,7 +6768,7 @@ PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport { xEntry.reset(new PPTFieldEntry); rIn.ReadUInt16(xEntry->nPos); - xEntry->pField1 = new SvxFieldItem( SvxHeaderField(), EE_FEATURE_FIELD ); + xEntry->xField1.reset(new SvxFieldItem(SvxHeaderField(), EE_FEATURE_FIELD)); } break; @@ -6779,13 +6776,13 @@ PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport { xEntry.reset(new PPTFieldEntry); rIn.ReadUInt16(xEntry->nPos); - xEntry->pField1 = new SvxFieldItem( SvxDateTimeField(), EE_FEATURE_FIELD ); + xEntry->xField1.reset(new SvxFieldItem(SvxDateTimeField(), EE_FEATURE_FIELD)); if ( rPersistEntry.pHeaderFooterEntry ) // sj: #i34111# on master pages it is possible { // that there is no HeaderFooterEntry available if ( rPersistEntry.pHeaderFooterEntry->nAtom & 0x20000 ) // auto date time xEntry->SetDateTime( rPersistEntry.pHeaderFooterEntry->nAtom & 0xff ); else - xEntry->pString = new OUString( rPersistEntry.pHeaderFooterEntry->pPlaceholder[ nVal ] ); + xEntry->xString.reset(new OUString( rPersistEntry.pHeaderFooterEntry->pPlaceholder[ nVal ] )); } } break; @@ -6804,7 +6801,7 @@ PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport switch( aTextHd.nRecType ) { case PPT_PST_SlideNumberMCAtom: - xEntry->pField1 = new SvxFieldItem( SvxPageField(), EE_FEATURE_FIELD ); + xEntry->xField1.reset(new SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD)); break; case PPT_PST_RTFDateTimeMCAtom: @@ -6837,7 +6834,7 @@ PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport else if (!n) { // End of format string - xEntry->pString = new OUString( aStr ); + xEntry->xString.reset(new OUString( aStr )); break; } else if (!inquote) @@ -6853,10 +6850,10 @@ PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport } } } - if (!xEntry->pString) + if (!xEntry->xString) { // Handle as previously - xEntry->pField1 = new SvxFieldItem( SvxDateField( Date( Date::SYSTEM ), SVXDATETYPE_FIX ), EE_FEATURE_FIELD ); + xEntry->xField1.reset(new SvxFieldItem( SvxDateField( Date( Date::SYSTEM ), SVXDATETYPE_FIX ), EE_FEATURE_FIELD )); } } } @@ -6898,7 +6895,7 @@ PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport aTarget += "#"; aTarget += pHyperlink->aConvSubString; } - xEntry->pField1 = new SvxFieldItem( SvxURLField( aTarget, OUString(), SVXURLFORMAT_REPR ), EE_FEATURE_FIELD ); + xEntry->xField1.reset(new SvxFieldItem( SvxURLField( aTarget, OUString(), SVXURLFORMAT_REPR ), EE_FEATURE_FIELD )); } } break; @@ -6962,11 +6959,10 @@ PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport pNewCPS->maString = aString.copy( nCount + 1, nBehind ); aCharPropList.insert( aCharPropList.begin() + n + 1, pNewCPS ); } - if ( (*FE)->pField2 ) + if ( (*FE)->xField2 ) { PPTCharPropSet* pNewCPS = new PPTCharPropSet( *pSet ); - pNewCPS->mpFieldItem.reset( (*FE)->pField2 ); - (*FE)->pField2 = nullptr; + pNewCPS->mpFieldItem = std::move((*FE)->xField2); aCharPropList.insert( aCharPropList.begin() + n + 1, pNewCPS ); pNewCPS = new PPTCharPropSet( *pSet ); @@ -6979,13 +6975,12 @@ PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport pNewCPS->maString = aString.copy( 0, nCount ); aCharPropList.insert( aCharPropList.begin() + n++, pNewCPS ); } - if ( (*FE)->pField1 ) + if ( (*FE)->xField1 ) { - pSet->mpFieldItem.reset( (*FE)->pField1 ); - (*FE)->pField1 = nullptr; + pSet->mpFieldItem = std::move((*FE)->xField1); } - else if ( (*FE)->pString ) - pSet->maString = *(*FE)->pString; + else if ( (*FE)->xString ) + pSet->maString = *(*FE)->xString; } else { @@ -7011,11 +7006,11 @@ PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport PPTCharPropSet* pCurrent = aCharPropList[ nIdx ]; sal_Int32 nNextStringLen = pCurrent->maString.getLength(); - DBG_ASSERT( (*FE)->pField1, "missing field!" ); - if (!(*FE)->pField1) + DBG_ASSERT( (*FE)->xField1, "missing field!" ); + if (!(*FE)->xField1) break; - const SvxURLField* pField = static_cast((*FE)->pField1->GetField()); + const SvxURLField* pField = static_cast((*FE)->xField1->GetField()); pCurrent->mbIsHyperlink = true; pCurrent->mnHylinkOrigColor = pCurrent->mpImplPPTCharPropSet->mnColor; @@ -7061,8 +7056,7 @@ PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport } nIdx++; } - delete (*FE)->pField1; - (*FE)->pField1 = nullptr; + (*FE)->xField1.reset(); if ( pBefCPS ) { diff --git a/include/filter/msfilter/svdfppt.hxx b/include/filter/msfilter/svdfppt.hxx index 36227d051941..d83be89a1405 100644 --- a/include/filter/msfilter/svdfppt.hxx +++ b/include/filter/msfilter/svdfppt.hxx @@ -473,11 +473,16 @@ struct MSFILTER_DLLPUBLIC PPTFieldEntry { sal_uInt16 nPos; sal_uInt16 nTextRangeEnd; - SvxFieldItem* pField1; - SvxFieldItem* pField2; - OUString* pString; + std::unique_ptr xField1; + std::unique_ptr xField2; + std::unique_ptr xString; + + PPTFieldEntry() + : nPos(0) + , nTextRangeEnd(0) + { + } - PPTFieldEntry() : nPos( 0 ), nTextRangeEnd( 0 ), pField1( nullptr ), pField2( nullptr ), pString( nullptr ) {}; ~PPTFieldEntry(); void SetDateTime( sal_uInt32 nType ); -- cgit