You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@axis.apache.org by Samisa Abeysinghe <sa...@yahoo.com> on 2004/04/14 08:31:30 UTC
Xerces Paser Memory Leaks - patch
Hi All,
I am using C++ clients with Xerces parser and noticed huge amounts of memory leaks, and
managed to find the reason.
When using the Xerces parser, the XMLString::transcode() method returns a memory buffer that
is expected to be deleted by the caller after use.
(in other words XMLString::transcode() calls must have matching XMLString::release() calls)
I found many memory leaks related to XMLString::transcode() calls in XercesHandler.cpp. (and
fixed them in the patch below)
Please apply this patch as soon as possible to CVS code for the benefit of those who use the
Xerces parser.
Thanks,
Samisa...
Here is the patch...
---------------------------------------------
diff -u ../../original/ws-axis/c/src/soap/XercesHandler.cpp src/soap/XercesHandler.cpp
--- ../../original/ws-axis/c/src/soap/XercesHandler.cpp 2004-04-09 19:31:05.000000000 +0600
+++ src/soap/XercesHandler.cpp 2004-04-13 10:24:51.000000000 +0600
@@ -30,31 +30,60 @@
{
m_nStatus = AXIS_SUCCESS;
Nelement = (AnyElement*)malloc(sizeof (AnyElement));
+ //initilize Nelement members
+ Nelement->m_pchNameOrValue = NULL;
+ Nelement->m_pchNamespace = NULL;
+ for( int i = 0; i < MAX_NO_OF_ATTRIBUTES*3; i++)
+ Nelement->m_pchAttributes[i] = NULL;
}
XercesHandler::~XercesHandler()
{
+ //free Nelement members
+ if(Nelement->m_pchNameOrValue)
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchNameOrValue));
+ if(Nelement->m_pchNamespace)
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchNamespace));
+ for( int i = 0; i < MAX_NO_OF_ATTRIBUTES*3; i++)
+ {
+ if(Nelement->m_pchAttributes[i])
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchAttributes[i]));
+ }
+ //free Nelement
+ free(Nelement);
}
-void XercesHandler::startElement(const XMLCh *const uri,const XMLCh *const
+void XercesHandler::startElement(const XMLCh *const uri,const XMLCh *const
localname,const XMLCh *const qname,
const Attributes &attrs)
{
m_pCurrElement = Nelement;
Nelement->m_type = START_ELEMENT;
+ //free alredy allocated transcodes
+ if(Nelement->m_pchNameOrValue)
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchNameOrValue));
+ if(Nelement->m_pchNamespace)
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchNamespace));
+
Nelement->m_pchNameOrValue = XMLString::transcode(localname);
Nelement->m_pchNamespace = XMLString::transcode(uri);
-
+
unsigned int len = attrs.getLength();
unsigned int index;
unsigned int i = 0;
for (index = 0; index < len*3; index+=3)
- {
- Nelement->m_pchAttributes[index] =
+ {
+ if(Nelement->m_pchAttributes[index])
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchAttributes[index]));
+ Nelement->m_pchAttributes[index] =
XMLString::transcode(attrs.getLocalName(i));
- Nelement->m_pchAttributes[index+1] =
+ if(Nelement->m_pchAttributes[index])
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchAttributes[index+1]));
+ Nelement->m_pchAttributes[index+1] =
XMLString::transcode(attrs.getURI(i));
- Nelement->m_pchAttributes[index+2] =
+ if(Nelement->m_pchAttributes[index])
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchAttributes[index + 2]));
+ Nelement->m_pchAttributes[index+2] =
XMLString::transcode(attrs.getValue(i));
i++;
}
@@ -70,14 +99,16 @@
return NULL;
}
-void XercesHandler::characters(const XMLCh* const chars,
+void XercesHandler::characters(const XMLCh* const chars,
const unsigned int length)
{
m_pCurrElement = Nelement;
Nelement->m_type = CHARACTER_ELEMENT;
+ if(Nelement->m_pchNameOrValue)
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchNameOrValue));
Nelement->m_pchNameOrValue = XMLString::transcode(chars);
}
-void XercesHandler::ignorableWhitespace(const XMLCh* const chars,
+void XercesHandler::ignorableWhitespace(const XMLCh* const chars,
const unsigned int length)
{}
void XercesHandler::resetDocument()
@@ -101,25 +132,41 @@
{
m_pCurrElement = Nelement;
Nelement->m_type = END_ELEMENT;
+ if(Nelement->m_pchNameOrValue)
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchNameOrValue));
+ if(Nelement->m_pchNamespace)
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchNamespace));
Nelement->m_pchNameOrValue = XMLString::transcode(localname);
Nelement->m_pchNamespace = XMLString::transcode(uri);
+ if(Nelement->m_pchAttributes[0])
+ XMLString::release(&const_cast<char *>(Nelement->m_pchAttributes[0]));
Nelement->m_pchAttributes[0] = NULL;
}
-void XercesHandler::startPrefixMapping(const XMLCh* const prefix,
+void XercesHandler::startPrefixMapping(const XMLCh* const prefix,
const XMLCh* const uri)
{
Nelement->m_type = START_PREFIX;
+ if(Nelement->m_pchNameOrValue)
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchNameOrValue));
+ if(Nelement->m_pchNamespace)
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchNamespace));
+
Nelement->m_pchNameOrValue = XMLString::transcode(prefix);
Nelement->m_pchNamespace = XMLString::transcode(uri);
- m_NsStack[XMLString::transcode(prefix)] = XMLString::transcode(uri);
+ //do not use transcodein this statement
+ //m_NsStack[XMLString::transcode(prefix)] = XMLString::transcode(uri);
+ m_NsStack[Nelement->m_pchNameOrValue] = Nelement->m_pchNamespace;
+
}
void XercesHandler::endPrefixMapping(const XMLCh* const prefix)
{
Nelement->m_type = END_PREFIX;
+ if(Nelement->m_pchNameOrValue)
+ XMLString::release(&const_cast<char *>(Nelement-> m_pchNameOrValue));
Nelement->m_pchNameOrValue = XMLString::transcode(prefix);
- m_NsStack.erase(XMLString::transcode(prefix));
+ m_NsStack.erase(Nelement->m_pchNameOrValue);
}
void XercesHandler::freeElement()
__________________________________
Do you Yahoo!?
Yahoo! Tax Center - File online by April 15th
http://taxes.yahoo.com/filing.html