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,
SvXMLNamespaceMap *mpRewindMap;
SAL_DLLPRIVATE SvXMLNamespaceMap *GetRewindMap() const
{ return mpRewindMap; }
SAL_DLLPRIVATE void SetRewindMap( SvXMLNamespaceMap *p ) { mpRewindMap = p; }
SAL_DLLPRIVATE SvXMLNamespaceMap *TakeRewindMap()
{ auto p = mpRewindMap; mpRewindMap = nullptr; return p; }
SAL_DLLPRIVATE void PutRewindMap( SvXMLNamespaceMap *p ) { mpRewindMap = p; }
protected:
......
......@@ -47,6 +47,7 @@ SvXMLImportContext::SvXMLImportContext( SvXMLImport& rImp ) :
SvXMLImportContext::~SvXMLImportContext()
{
delete mpRewindMap;
}
SvXMLImportContext *SvXMLImportContext::CreateChildContext( sal_uInt16 nPrefix,
......
......@@ -731,7 +731,7 @@ void SAL_CALL SvXMLImport::startElement( const OUString& rName,
// Remember old namespace map.
if( pRewindMap )
pContext->SetRewindMap( pRewindMap );
pContext->PutRewindMap( pRewindMap );
// Call a startElement at the new context.
pContext->StartElement( xAttrList );
......@@ -768,7 +768,7 @@ rName
pContext->EndElement();
// Get a namespace map to rewind.
SvXMLNamespaceMap *pRewindMap = pContext->GetRewindMap();
SvXMLNamespaceMap *pRewindMap = pContext->TakeRewindMap();
// Delete the current context.
pContext->ReleaseRef();
......
......@@ -303,7 +303,7 @@ void SAL_CALL XMLTransformerBase::startElement( const OUString& rName,
// Remember old namespace map.
if( pRewindMap )
xContext->SetRewindMap( pRewindMap );
xContext->PutRewindMap( pRewindMap );
// Push context on stack.
m_pContexts.push_back( xContext );
......@@ -336,7 +336,7 @@ rName
m_pContexts.pop_back();
// Get a namespace map to rewind.
SvXMLNamespaceMap *pRewindMap = xContext->GetRewindMap();
SvXMLNamespaceMap *pRewindMap = xContext->TakeRewindMap();
// Delete the current context.
xContext = nullptr;
......
......@@ -56,6 +56,7 @@ XMLTransformerContext::XMLTransformerContext( XMLTransformerBase& rImp,
XMLTransformerContext::~XMLTransformerContext()
{
delete m_pRewindMap;
}
rtl::Reference<XMLTransformerContext> XMLTransformerContext::CreateChildContext( sal_uInt16 nPrefix,
......
......@@ -39,8 +39,9 @@ class XMLTransformerContext : public ::salhelper::SimpleReferenceObject
SvXMLNamespaceMap *m_pRewindMap;
SvXMLNamespaceMap *GetRewindMap() const { return m_pRewindMap; }
void SetRewindMap( SvXMLNamespaceMap *p ) { m_pRewindMap = p; }
SvXMLNamespaceMap *TakeRewindMap()
{ auto p = m_pRewindMap; m_pRewindMap = nullptr; return p; }
void PutRewindMap( SvXMLNamespaceMap *p ) { m_pRewindMap = p; }
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