Hi, I'm using xmlParseBalancedChunkMemory to parse a XML fragment that I want to attach to a document. If the fragment contains an external entity reference &ext; for an entity that has been declared in the document's DTD but not yet parsed (i.e. the main document does not contain &ext;), I get a segmentation fault when I attempt to free the parsed nodes. If on the other hand the main document contains &ext; everything just works. I'm attaching a full example (foo.c - modified parse1.c example) and sample XML files I use (foo1.xml passed as ARG to ./foo, e2.xml is the external entity), but in brief, the code looks like this: xmlNodePtr nodes = NULL; doc = xmlReadFile("foo1.xml", NULL, 0); if (doc == NULL) return; xmlParseBalancedChunkMemory( doc, NULL, NULL, 0, "&ext;", &nodes ); if (nodes) xmlFreeNodeList(nodes); /* this causes a SIGSEGV */ xmlFreeDoc(doc); If the file "foo1.xml" contains <!DOCTYPE doc [ <!ENTITY ext SYSTEM "e2.xml"> ] <doc>&ext;</doc> it works, if the last line is just "<doc/>", it fails. The output from valgrind indicates a double free (see below). Any hints? ==22130== Invalid read of size 4 ==22130== at 0x4042D35: xmlFreeNodeList (tree.c:3376) ==22130== by 0x4023CE5: xmlFreeEntity (entities.c:107) ==22130== by 0x404BA03: xmlHashFree (hash.c:307) ==22130== by 0x40247DD: xmlFreeEntitiesTable (entities.c:758) ==22130== by 0x404314D: xmlFreeDtd (tree.c:1111) ==22130== by 0x4043285: xmlFreeDoc (tree.c:1213) ==22130== by 0x804869C: example1Func (in /export/home/pajas/projects/XML-LibXML-devel/XML-LibXML/foo) ==22130== by 0x80486E2: main (in /export/home/pajas/projects/XML-LibXML-devel/XML-LibXML/foo) ==22130== Address 0x41202D8 is 80 bytes inside a block of size 88 free'd ==22130== at 0x40050FF: free (vg_replace_malloc.c:233) ==22130== by 0x4043365: xmlFreeDoc (tree.c:1223) ==22130== by 0x403E068: xmlParseBalancedChunkMemoryRecover (parser.c:12098) ==22130== by 0x403E1F6: xmlParseBalancedChunkMemory (parser.c:11562) ==22130== by 0x8048686: example1Func (in /export/home/pajas/projects/XML-LibXML-devel/XML-LibXML/foo) ==22130== by 0x80486E2: main (in /export/home/pajas/projects/XML-LibXML-devel/XML-LibXML/foo) This is on a 32bit FC7, with libxml2 2.7.2. Thanks, -- Petr
Attachment:
foo.c
Description: Text Data
Attachment:
e2.xml
Description: Text Data
Attachment:
foo1.xml
Description: Text Data