From 2d84a89478ccf8e65d6ab94a919f403cc1968d47 Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Mon, 30 Dec 2002 00:01:08 +0000 Subject: [PATCH] Fixed a really nasty problem raised by a DocBook XSLT transform provided * entities.c parser.c tree.c include/libxml/entities.h: Fixed a really nasty problem raised by a DocBook XSLT transform provided by Sebastian Bergmann Daniel --- ChangeLog | 6 ++++++ entities.c | 19 +++++++++++++++++-- include/libxml/entities.h | 1 + parser.c | 4 ++++ tree.c | 1 + 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5d195011..e9c187ea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Mon Dec 30 00:59:07 CET 2002 Daniel Veillard + + * entities.c parser.c tree.c include/libxml/entities.h: Fixed + a really nasty problem raised by a DocBook XSLT transform + provided by Sebastian Bergmann + Sun Dec 29 12:13:18 CET 2002 Daniel Veillard * xmlreader.c python/tests/reader.py: fixed a bug pointed out diff --git a/entities.c b/entities.c index dbdf9ebf..8f3dfd8a 100644 --- a/entities.c +++ b/entities.c @@ -48,7 +48,7 @@ static xmlHashTablePtr xmlPredefinedEntities = NULL; static void xmlFreeEntity(xmlEntityPtr entity) { if (entity == NULL) return; - if ((entity->children) && + if ((entity->children) && (entity->owner == 1) && (entity == (xmlEntityPtr) entity->children->parent)) xmlFreeNodeList(entity->children); if (entity->name != NULL) @@ -127,6 +127,7 @@ xmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type, ret->URI = NULL; /* to be computed by the layer knowing the defining entity */ ret->orig = NULL; + ret->owner = 0; if (xmlHashAddEntry(table, name, ret)) { /* @@ -846,6 +847,20 @@ xmlCreateEntitiesTable(void) { return((xmlEntitiesTablePtr) xmlHashCreate(0)); } +/** + * xmlFreeEntityWrapper: + * @entity: An entity + * @name: its name + * + * Deallocate the memory used by an entities in the hash table. + */ +static void +xmlFreeEntityWrapper(xmlEntityPtr entity, + const xmlChar *name ATTRIBUTE_UNUSED) { + if (entity != NULL) + xmlFreeEntity(entity); +} + /** * xmlFreeEntitiesTable: * @table: An entity table @@ -854,7 +869,7 @@ xmlCreateEntitiesTable(void) { */ void xmlFreeEntitiesTable(xmlEntitiesTablePtr table) { - xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntity); + xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntityWrapper); } /** diff --git a/include/libxml/entities.h b/include/libxml/entities.h index 480009c0..ea7f2020 100644 --- a/include/libxml/entities.h +++ b/include/libxml/entities.h @@ -52,6 +52,7 @@ struct _xmlEntity { struct _xmlEntity *nexte; /* unused */ const xmlChar *URI; /* the full URI as computed */ + int owner; /* does the entity own the childrens */ }; /* diff --git a/parser.c b/parser.c index 578a73cf..79b46c0d 100644 --- a/parser.c +++ b/parser.c @@ -5474,6 +5474,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) { (ent->children == NULL)) { ent->children = list; ent->last = list; + ent->owner = 1; list->parent = (xmlNodePtr) ent; } else { xmlFreeNodeList(list); @@ -5539,7 +5540,9 @@ xmlParseReference(xmlParserCtxtPtr ctxt) { (list->next == NULL)) { list->parent = (xmlNodePtr) ent; list = NULL; + ent->owner = 1; } else { + ent->owner = 0; while (list != NULL) { list->parent = (xmlNodePtr) ctxt->node; list->doc = ctxt->myDoc; @@ -5552,6 +5555,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) { xmlAddEntityReference(ent, list, NULL); } } else { + ent->owner = 1; while (list != NULL) { list->parent = (xmlNodePtr) ent; if (list->next == NULL) diff --git a/tree.c b/tree.c index 807189ef..67b7d164 100644 --- a/tree.c +++ b/tree.c @@ -837,6 +837,7 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) { ent->children = xmlStringGetNodeList(doc, (const xmlChar*)node->content); + ent->owner = 1; temp = ent->children; while (temp) { temp->parent = (xmlNodePtr)ent;