[Libreoffice-commits] core.git: Branch 'libreoffice-4-1' - sw/source
Miklos Vajna
vmiklos at suse.cz
Thu Jun 6 07:55:55 PDT 2013
sw/source/filter/ww8/docxattributeoutput.cxx | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
New commits:
commit c0129c7199b1662caf010fa556b2973196ce7b07
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Thu Jun 6 16:35:52 2013 +0200
bnc#382137 DocxAttributeOutput: don't store address of local variable
AttributeOutputBase::TextField() passes the address of its local
variable to WriteExpand(), and DocxAttributeOutput::WriteField_Impl()
stored this. When it was to be used, the variable already went out of
scope, resulting in a crash. Given that SwField is an abstract base
class, the easiest way is to just copy the field and manually delete it
when it's no longer needed.
Change-Id: I9d1fe2485277f1ac21a576d7ff0d05003f0ac8a1
(cherry picked from commit 92f328fb5eef672d379ed0b712b025eb80622d5a)
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 549ed52..66c003e 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -564,6 +564,8 @@ void DocxAttributeOutput::EndRun()
// Unknown fields sould be removed too
if ( !pIt->bClose || ( pIt->eType == ww::eUNKNOWN ) )
{
+ if (pIt->pField)
+ delete pIt->pField;
pIt = m_Fields.erase( pIt );
continue;
}
@@ -598,6 +600,8 @@ void DocxAttributeOutput::EndRun()
// Remove the field if no end needs to be written
if ( !pIt->bClose ) {
+ if (pIt->pField)
+ delete pIt->pField;
pIt = m_Fields.erase( pIt );
continue;
}
@@ -646,6 +650,8 @@ void DocxAttributeOutput::EndRun()
while ( m_Fields.begin() != m_Fields.end() )
{
EndField_Impl( m_Fields.front( ) );
+ if (m_Fields.front().pField)
+ delete m_Fields.front().pField;
m_Fields.erase( m_Fields.begin( ) );
}
@@ -3829,7 +3835,8 @@ void DocxAttributeOutput::WriteExpand( const SwField* pFld )
void DocxAttributeOutput::WriteField_Impl( const SwField* pFld, ww::eField eType, const String& rFldCmd, sal_uInt8 nMode )
{
struct FieldInfos infos;
- infos.pField = pFld;
+ if (pFld)
+ infos.pField = pFld->CopyField();
infos.sCmd = rFldCmd;
infos.eType = eType;
infos.bClose = WRITEFIELD_CLOSE & nMode;
More information about the Libreoffice-commits
mailing list