Kaydet (Commit) d1385731 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Avoid memory leaks

...when exceptions get thrown while a context owns an rewind map

Change-Id: I90d26caa57ef2ff508e6eae05ddbc62cdb3f01ea
üst c535f115
...@@ -44,9 +44,9 @@ class XMLOFF_DLLPUBLIC SvXMLImportContext : public SvRefBase, ...@@ -44,9 +44,9 @@ class XMLOFF_DLLPUBLIC SvXMLImportContext : public SvRefBase,
SvXMLNamespaceMap *mpRewindMap; SvXMLNamespaceMap *mpRewindMap;
SAL_DLLPRIVATE SvXMLNamespaceMap *GetRewindMap() const SAL_DLLPRIVATE SvXMLNamespaceMap *TakeRewindMap()
{ return mpRewindMap; } { auto p = mpRewindMap; mpRewindMap = nullptr; return p; }
SAL_DLLPRIVATE void SetRewindMap( SvXMLNamespaceMap *p ) { mpRewindMap = p; } SAL_DLLPRIVATE void PutRewindMap( SvXMLNamespaceMap *p ) { mpRewindMap = p; }
protected: protected:
......
...@@ -47,6 +47,7 @@ SvXMLImportContext::SvXMLImportContext( SvXMLImport& rImp ) : ...@@ -47,6 +47,7 @@ SvXMLImportContext::SvXMLImportContext( SvXMLImport& rImp ) :
SvXMLImportContext::~SvXMLImportContext() SvXMLImportContext::~SvXMLImportContext()
{ {
delete mpRewindMap;
} }
SvXMLImportContext *SvXMLImportContext::CreateChildContext( sal_uInt16 nPrefix, SvXMLImportContext *SvXMLImportContext::CreateChildContext( sal_uInt16 nPrefix,
......
...@@ -731,7 +731,7 @@ void SAL_CALL SvXMLImport::startElement( const OUString& rName, ...@@ -731,7 +731,7 @@ void SAL_CALL SvXMLImport::startElement( const OUString& rName,
// Remember old namespace map. // Remember old namespace map.
if( pRewindMap ) if( pRewindMap )
pContext->SetRewindMap( pRewindMap ); pContext->PutRewindMap( pRewindMap );
// Call a startElement at the new context. // Call a startElement at the new context.
pContext->StartElement( xAttrList ); pContext->StartElement( xAttrList );
...@@ -768,7 +768,7 @@ rName ...@@ -768,7 +768,7 @@ rName
pContext->EndElement(); pContext->EndElement();
// Get a namespace map to rewind. // Get a namespace map to rewind.
SvXMLNamespaceMap *pRewindMap = pContext->GetRewindMap(); SvXMLNamespaceMap *pRewindMap = pContext->TakeRewindMap();
// Delete the current context. // Delete the current context.
pContext->ReleaseRef(); pContext->ReleaseRef();
......
...@@ -303,7 +303,7 @@ void SAL_CALL XMLTransformerBase::startElement( const OUString& rName, ...@@ -303,7 +303,7 @@ void SAL_CALL XMLTransformerBase::startElement( const OUString& rName,
// Remember old namespace map. // Remember old namespace map.
if( pRewindMap ) if( pRewindMap )
xContext->SetRewindMap( pRewindMap ); xContext->PutRewindMap( pRewindMap );
// Push context on stack. // Push context on stack.
m_pContexts.push_back( xContext ); m_pContexts.push_back( xContext );
...@@ -336,7 +336,7 @@ rName ...@@ -336,7 +336,7 @@ rName
m_pContexts.pop_back(); m_pContexts.pop_back();
// Get a namespace map to rewind. // Get a namespace map to rewind.
SvXMLNamespaceMap *pRewindMap = xContext->GetRewindMap(); SvXMLNamespaceMap *pRewindMap = xContext->TakeRewindMap();
// Delete the current context. // Delete the current context.
xContext = nullptr; xContext = nullptr;
......
...@@ -56,6 +56,7 @@ XMLTransformerContext::XMLTransformerContext( XMLTransformerBase& rImp, ...@@ -56,6 +56,7 @@ XMLTransformerContext::XMLTransformerContext( XMLTransformerBase& rImp,
XMLTransformerContext::~XMLTransformerContext() XMLTransformerContext::~XMLTransformerContext()
{ {
delete m_pRewindMap;
} }
rtl::Reference<XMLTransformerContext> XMLTransformerContext::CreateChildContext( sal_uInt16 nPrefix, rtl::Reference<XMLTransformerContext> XMLTransformerContext::CreateChildContext( sal_uInt16 nPrefix,
......
...@@ -39,8 +39,9 @@ class XMLTransformerContext : public ::salhelper::SimpleReferenceObject ...@@ -39,8 +39,9 @@ class XMLTransformerContext : public ::salhelper::SimpleReferenceObject
SvXMLNamespaceMap *m_pRewindMap; SvXMLNamespaceMap *m_pRewindMap;
SvXMLNamespaceMap *GetRewindMap() const { return m_pRewindMap; } SvXMLNamespaceMap *TakeRewindMap()
void SetRewindMap( SvXMLNamespaceMap *p ) { m_pRewindMap = p; } { auto p = m_pRewindMap; m_pRewindMap = nullptr; return p; }
void PutRewindMap( SvXMLNamespaceMap *p ) { m_pRewindMap = p; }
protected: protected:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment