[JIRA] Created: (CPPXT-86) Small Memory Leak in XMLObjectBuilder::buildFromElement()

selhorst@idp.protectnetwork.org (JIRA) noreply at shibboleth.net
Wed May 16 10:03:03 BST 2012


Small Memory Leak in XMLObjectBuilder::buildFromElement()
---------------------------------------------------------

                 Key: CPPXT-86
                 URL: https://issues.shibboleth.net/jira/browse/CPPXT-86
             Project: XMLTooling - C++
          Issue Type: Bug
          Components: Other
    Affects Versions: 1.4.2
            Reporter: selhorst at idp.protectnetwork.org
            Assignee: Scott Cantor


Dear XML-Tooling-Developers,

we identified a minor memory leak in the method XMLObjectBuilder::buildFromElement() in XMLTooling (C++ Version 1.4.2).
Please find attached a patch for this issue and the output of Valgrind before and after applying the patch.

-----------------
- before patch  -
-----------------
==18035== Memcheck, a memory error detector
==18035== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==18035== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==18035== Command: /var/www/fcgi-bin/foo.bin
==18035== Parent PID: 18032
==18035== 
==18035== 1,854 (240 direct, 1,614 indirect) bytes in 10 blocks are definitely lost
==18035==    at 0x4C24DFA: operator new(unsigned long) (vg_replace_malloc.c:261)
==18035==    by 0x7259F84: xmltooling::XMLHelper::getXSIType(xercesc_3_1::DOMElement const*) (XMLHelper.cpp:59)
==18035==    by 0x722AA69: xmltooling::XMLObjectBuilder::buildFromElement(xercesc_3_1::DOMElement*, bool) const (XMLObjectBuilder.cpp:60)
==18035==    by 0x723887F: xmltooling::AbstractXMLObjectUnmarshaller::unmarshallContent(xercesc_3_1::DOMElement const*) (AbstractXMLObjectUnmarshaller.cpp:199)
==18035==    by 0x7239A29: xmltooling::AbstractXMLObjectUnmarshaller::unmarshall(xercesc_3_1::DOMElement*, bool) (AbstractXMLObjectUnmarshaller.cpp:73)
==18035==    by 0x722AAC8: xmltooling::XMLObjectBuilder::buildFromElement(xercesc_3_1::DOMElement*, bool) const (XMLObjectBuilder.cpp:61)
==18035==    by 0x723887F: xmltooling::AbstractXMLObjectUnmarshaller::unmarshallContent(xercesc_3_1::DOMElement const*) (AbstractXMLObjectUnmarshaller.cpp:199)
==18035==    by 0x7239A29: xmltooling::AbstractXMLObjectUnmarshaller::unmarshall(xercesc_3_1::DOMElement*, bool) (AbstractXMLObjectUnmarshaller.cpp:73)
==18035==    by 0x722AAC8: xmltooling::XMLObjectBuilder::buildFromElement(xercesc_3_1::DOMElement*, bool) const (XMLObjectBuilder.cpp:61)
==18035==    by 0x723887F: xmltooling::AbstractXMLObjectUnmarshaller::unmarshallContent(xercesc_3_1::DOMElement const*) (AbstractXMLObjectUnmarshaller.cpp:199)
==18035==    by 0x7239A29: xmltooling::AbstractXMLObjectUnmarshaller::unmarshall(xercesc_3_1::DOMElement*, bool) (AbstractXMLObjectUnmarshaller.cpp:73)
==18035==    by 0x722AAC8: xmltooling::XMLObjectBuilder::buildFromElement(xercesc_3_1::DOMElement*, bool) const (XMLObjectBuilder.cpp:61)
==18035==    by 0x723887F: xmltooling::AbstractXMLObjectUnmarshaller::unmarshallContent(xercesc_3_1::DOMElement const*) (AbstractXMLObjectUnmarshaller.cpp:199)
==18035==    by 0x7239A29: xmltooling::AbstractXMLObjectUnmarshaller::unmarshall(xercesc_3_1::DOMElement*, bool) (AbstractXMLObjectUnmarshaller.cpp:73)
==18035==    by 0x722AAC8: xmltooling::XMLObjectBuilder::buildFromElement(xercesc_3_1::DOMElement*, bool) const (XMLObjectBuilder.cpp:61)
==18035==    by 0x5CE5489: opensaml::saml2::EncryptedElementType::decrypt(xmltooling::CredentialResolver const&, unsigned short const*, xmltooling::CredentialCriteria*) const (Assertions.cpp:269)
==18035==    by 0x439303: main (foo.cxx:509)
==18035== 2,670 (312 direct, 2,358 indirect) bytes in 13 blocks are definitely lost
==18035==    at 0x4C24DFA: operator new(unsigned long) (vg_replace_malloc.c:261)
==18035==    by 0x7259F84: xmltooling::XMLHelper::getXSIType(xercesc_3_1::DOMElement const*) (XMLHelper.cpp:59)
==18035==    by 0x722AA69: xmltooling::XMLObjectBuilder::buildFromElement(xercesc_3_1::DOMElement*, bool) const (XMLObjectBuilder.cpp:60)
==18035==    by 0x723887F: xmltooling::AbstractXMLObjectUnmarshaller::unmarshallContent(xercesc_3_1::DOMElement const*) (AbstractXMLObjectUnmarshaller.cpp:199)
==18035==    by 0x7239A29: xmltooling::AbstractXMLObjectUnmarshaller::unmarshall(xercesc_3_1::DOMElement*, bool) (AbstractXMLObjectUnmarshaller.cpp:73)
==18035==    by 0x722AAC8: xmltooling::XMLObjectBuilder::buildFromElement(xercesc_3_1::DOMElement*, bool) const (XMLObjectBuilder.cpp:61)
==18035==    by 0x723887F: xmltooling::AbstractXMLObjectUnmarshaller::unmarshallContent(xercesc_3_1::DOMElement const*) (AbstractXMLObjectUnmarshaller.cpp:199)
==18035==    by 0x7239A29: xmltooling::AbstractXMLObjectUnmarshaller::unmarshall(xercesc_3_1::DOMElement*, bool) (AbstractXMLObjectUnmarshaller.cpp:73)
==18035==    by 0x722AAC8: xmltooling::XMLObjectBuilder::buildFromElement(xercesc_3_1::DOMElement*, bool) const (XMLObjectBuilder.cpp:61)
==18035==    by 0x723887F: xmltooling::AbstractXMLObjectUnmarshaller::unmarshallContent(xercesc_3_1::DOMElement const*) (AbstractXMLObjectUnmarshaller.cpp:199)
==18035==    by 0x7239A29: xmltooling::AbstractXMLObjectUnmarshaller::unmarshall(xercesc_3_1::DOMElement*, bool) (AbstractXMLObjectUnmarshaller.cpp:73)
==18035==    by 0x722AAC8: xmltooling::XMLObjectBuilder::buildFromElement(xercesc_3_1::DOMElement*, bool) const (XMLObjectBuilder.cpp:61)
==18035==    by 0x5CE5489: opensaml::saml2::EncryptedElementType::decrypt(xmltooling::CredentialResolver const&, unsigned short const*, xmltooling::CredentialCriteria*) const (Assertions.cpp:269)
==18035==    by 0x439303: main (foo.cxx:509)
==18035== 
==18035== LEAK SUMMARY:
==18035==    definitely lost: 552 bytes in 23 blocks
==18035==    indirectly lost: 3,972 bytes in 69 blocks
==18035==         suppressed: 0 bytes in 0 blocks

-----------------
-  after patch  -
-----------------
==18838== Memcheck, a memory error detector
==18838== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==18838== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==18038== Command: /var/www/fcgi-bin/foo.bin
==18838== Parent PID: 18835
==18838== 
==18838== LEAK SUMMARY:
==18838==    definitely lost: 0 bytes in 0 blocks
==18838==    indirectly lost: 0 bytes in 0 blocks
==18838==         suppressed: 0 bytes in 0 blocks

-----------------
-     patch     -
-----------------

--- XMLObjectBuilder.cpp.orig	2012-04-10 15:41:49.000000000 +0200
+++ XMLObjectBuilder.cpp	2012-04-10 15:43:01.000000000 +0200
@@ -55,9 +55,9 @@ XMLObject* XMLObjectBuilder::buildFromQN
 
 XMLObject* XMLObjectBuilder::buildFromElement(DOMElement* element, bool bindDocument) const
 {
+    auto_ptr<QName> schemaType(XMLHelper::getXSIType(element));
     auto_ptr<XMLObject> ret(
-        buildObject(element->getNamespaceURI(),element->getLocalName(),element->getPrefix(),XMLHelper::getXSIType(element))
-        );
+        buildObject(element->getNamespaceURI(),element->getLocalName(),element->getPrefix(),schemaType.get()));
     ret->unmarshall(element,bindDocument);
     return ret.release();
 }



--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the commits mailing list