Re: [xml] exception/segfault on xmlFreeDoc()
- From: "Eric S. Eberhard" <flash vicspdi com>
- To: <oliverst online de>
- Cc: xml gnome org
- Subject: Re: [xml] exception/segfault on xmlFreeDoc()
- Date: Wed, 10 Mar 2004 13:07:18 -0700
A general suggestion (having written a lot of memory management over the 
years) is to replace "free" with
some other routine  (say "my_free") throughout.  This routine would take 
the address of the pointer rather than the pointer ... then it becomes a 
simple routine:
int my_free(void **ptr)
{
        if (!*ptr)
                return(0);
        free(*ptr);
        *ptr = NULL;
        return(1);
}
The return code tells if it was actually free'd ... for debugging purposes 
sometimes useful.
This tends to generically solve the problem of double frees as well as the 
problem of accessing memory that has been freed.
Something to consider for future release :-)
At 10:54 AM 3/10/04, you wrote:
When I run test_LoadDocument() I get a exception/segfault in the
xmlFreeDoc() after the successful LoadDocument.
With MSVC++ and libxml2-2.6.5 it crashes in dict.c line 709, because
dict has already been free'd.
The libxml2 has been linked statically and was compiled with teh
following configuration and defines:
cscript configure.js xml_debug=no debug=no static=yes iconv=no
schemas=no regexps=no docb=no threads=native ftp=no http=no reader=no
walker=no legacy=no xpath=yes xptr=no catalog=no xinclude=no c14n=no
cruntime=/MT
LIBXML_STATIC / LIBXML_STATIC_FOR_DLL / _REENTRANT / HAVE_WIN32_THREADS
And trying an older version (I don't have the version number handy) in
MinGW also crashes. The crash does happen in valid.c line 2856
(xmlGetDtdAttrDesc() -> if (dtd->attributes == NULL) return(NULL);)
because dtd has already been free'd.
I looked all over it and couldn't see the problem at all. It all looked
fine to me. I unlinked the nodes properly.
Here is the code:
bool CreateXMLDocument(xmlDocPtr* ppDoc)
{
    try
    {
        if (ppDoc == NULL) return false;
                *ppDoc = NULL;
                *ppDoc = xmlNewDoc(BAD_CAST "1.0");
                if( *ppDoc != NULL )
                        return true;
    }
    catch (...) { }
        return false;
}
int CreateLoadXMLDoc(xmlDocPtr* ppDoc, const char* Filename)
{
    try
    {
            if (ppDoc == NULL) return -1;
            *ppDoc = NULL;
            // Create XML document
            xmlDocPtr pXMLDoc = NULL;
            if (!CreateXMLDocument(&pXMLDoc))
                    return -1;
            // Load XML file, if a file name is given
            if (Filename)
            {
                        pXMLDoc = xmlParseFile(Filename);
                        if( pXMLDoc == NULL )
                                return -1;
            }
            *ppDoc = pXMLDoc;
            return 0;
    }
    catch (...)
    {
        return -1;
    }
}
bool LoadDocument(const char* Filename, xmlDocPtr pDoc)
{
        xmlDocPtr doc = NULL;
        xmlNodePtr root = NULL, new_root = NULL;
        root = pDoc->children;
        if( root ) {
                xmlUnlinkNode(root);
                xmlFree(root);
        }
        if( CreateLoadXMLDoc(&doc, Filename) != 0 )
                return false;
        new_root = doc->children;
        if( new_root == NULL )
                return false;
        xmlUnlinkNode(new_root);
        if( doc )
                xmlFreeDoc(doc);
        xmlDocSetRootElement(pDoc, new_root);
        if( pDoc == NULL )
                return false;
        return true;
}
bool test_LoadDocument()
{
        xmlDocPtr doc = NULL;
        if( !CreateXMLDocument(&doc) ) {
                return false;
        }
        if( LoadDocument("_pluginList.xml", doc) ) {
                xmlFreeDoc(doc);
                return true;
        }
        xmlFreeDoc(doc);
        return false;
}
_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
xml gnome org
http://mail.gnome.org/mailman/listinfo/xml
Eric S. Eberhard
(928) 567-3727          Voice
(928) 567-6122          Fax
(800) 569-1122          Denver Office (I am never there, you can leave a 
message)
(720) 339-4765          Cell
http://www.vicspdi.com
Completely updated web site of personal pictures with many new 
pictures!  Includes horses, dogs, Corvairs, and more.
http://www.vicspdi.com/ourpics/index.html
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]