From 89c240f7ac322eab267bb444fb9d97b10238c7fe Mon Sep 17 00:00:00 2001 From: marian Date: Thu, 20 Jan 2011 14:10:13 +0000 Subject: [PATCH] Fixed memory leak: release the fragment owned by a DOM parser. Release the temporary parser used when loading an xml document from a file. git-svn-id: http://yate.null.ro/svn/yate/trunk@4046 acf43c95-373e-0410-b603-e72c3f656dc1 --- libs/yxml/XML.cpp | 24 ++++++++++++++---------- libs/yxml/yatexml.h | 4 +++- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/libs/yxml/XML.cpp b/libs/yxml/XML.cpp index 5d29f15a..344130ab 100644 --- a/libs/yxml/XML.cpp +++ b/libs/yxml/XML.cpp @@ -1048,7 +1048,7 @@ bool XmlSaxParser::processElement(NamedList& list, bool empty) */ XmlDomParser::XmlDomParser(const char* name, bool fragment) : XmlSaxParser(name), - m_current(0), m_data(0) + m_current(0), m_data(0), m_ownData(true) { if (fragment) m_data = new XmlFragment(); @@ -1056,15 +1056,19 @@ XmlDomParser::XmlDomParser(const char* name, bool fragment) m_data = new XmlDocument(); } -XmlDomParser::XmlDomParser(XmlParent* parent) - : m_current(0), m_data(0) +XmlDomParser::XmlDomParser(XmlParent* fragment, bool takeOwnership) + : m_current(0), m_data(0), m_ownData(takeOwnership) { - m_data = parent; + m_data = fragment; } XmlDomParser::~XmlDomParser() { - reset(); + if (m_ownData) { + reset(); + if (m_data) + delete m_data; + } } // Create a new xml comment and append it in the xml three @@ -1520,22 +1524,22 @@ void XmlDocument::reset() // Load this document from data stream and parse it XmlSaxParser::Error XmlDocument::read(Stream& in, int* error) { - XmlDomParser* parser = new XmlDomParser(this); + XmlDomParser parser(static_cast(this),false); char buf[8096]; while (true) { int rd = in.readData(buf,sizeof(buf) - 1); if (rd > 0) { buf[rd] = 0; - if (parser->parse(buf) || parser->error() == XmlSaxParser::Incomplete) + if (parser.parse(buf) || parser.error() == XmlSaxParser::Incomplete) continue; break; } break; } - if (parser->error() != XmlSaxParser::NoError) { + if (parser.error() != XmlSaxParser::NoError) { DDebug(DebugNote,"XmlDocument error loading stream. Parser error %d '%s' [%p]", - parser->error(),parser->getError(),this); - return parser->error(); + parser.error(),parser.getError(),this); + return parser.error(); } if (in.error()) { if (error) diff --git a/libs/yxml/yatexml.h b/libs/yxml/yatexml.h index 3199f908..39e11354 100644 --- a/libs/yxml/yatexml.h +++ b/libs/yxml/yatexml.h @@ -596,8 +596,9 @@ public: /** * XmlDomParser constructor * @param fragment The fragment who should keep the parsed data + * @param takeOwnership True to take ownership of the fragment */ - XmlDomParser(XmlParent* fragment); + XmlDomParser(XmlParent* fragment, bool takeOwnership); /** * Destructor @@ -692,6 +693,7 @@ protected: private: XmlElement* m_current; // The current xml element XmlParent* m_data; // Main xml fragment + bool m_ownData; // The DOM owns data }; /**