diff options
author | Nick Wellnhofer <wellnhofer@aevum.de> | 2020-02-11 16:17:34 +0100 |
---|---|---|
committer | Nick Wellnhofer <wellnhofer@aevum.de> | 2020-02-11 16:37:52 +0100 |
commit | f9ea1a24ed0fd2fd051bb01b0d08cdff60887938 (patch) | |
tree | 1ad39e9602f0a97fea48324b3be9cfe295a6c9e2 | |
parent | 7ffcd44d7e6c46704f8af0321d9314cd26e0e18a (diff) | |
download | libxml2-f9ea1a24ed0fd2fd051bb01b0d08cdff60887938.tar.gz |
Fix copying of entities in xmlParseReference
Before, reader mode would end up in a branch that didn't handle
entities with multiple children and failed to update ent->last, so the
hack copying the "extra" reader data wouldn't trigger. Consequently,
some empty nodes in entities are correctly detected now in the test
suite. (The detection of empty nodes in entities is still buggy,
though.)
-rw-r--r-- | parser.c | 64 | ||||
-rw-r--r-- | result/att7.rde | 3 | ||||
-rw-r--r-- | result/ent9.rde | 6 |
3 files changed, 33 insertions, 40 deletions
@@ -7159,42 +7159,38 @@ xmlParseReference(xmlParserCtxtPtr ctxt) { (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY))&& (ent->children == NULL)) { ent->children = list; - if (ctxt->replaceEntities) { - /* - * Prune it directly in the generated document - * except for single text nodes. - */ - if (((list->type == XML_TEXT_NODE) && - (list->next == NULL)) || - (ctxt->parseMode == XML_PARSE_READER)) { - 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; - if (list->next == NULL) - ent->last = list; - list = list->next; - } - list = ent->children; + /* + * Prune it directly in the generated document + * except for single text nodes. + */ + if ((ctxt->replaceEntities == 0) || + (ctxt->parseMode == XML_PARSE_READER) || + ((list->type == XML_TEXT_NODE) && + (list->next == NULL))) { + ent->owner = 1; + while (list != NULL) { + list->parent = (xmlNodePtr) ent; + xmlSetTreeDoc(list, ent->doc); + if (list->next == NULL) + ent->last = list; + list = list->next; + } + list = NULL; + } else { + ent->owner = 0; + while (list != NULL) { + list->parent = (xmlNodePtr) ctxt->node; + list->doc = ctxt->myDoc; + if (list->next == NULL) + ent->last = list; + list = list->next; + } + list = ent->children; #ifdef LIBXML_LEGACY_ENABLED - if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) - xmlAddEntityReference(ent, list, NULL); + if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) + xmlAddEntityReference(ent, list, NULL); #endif /* LIBXML_LEGACY_ENABLED */ - } - } else { - ent->owner = 1; - while (list != NULL) { - list->parent = (xmlNodePtr) ent; - xmlSetTreeDoc(list, ent->doc); - if (list->next == NULL) - ent->last = list; - list = list->next; - } - } + } } else { xmlFreeNodeList(list); list = NULL; diff --git a/result/att7.rde b/result/att7.rde index afcef5fe..60796379 100644 --- a/result/att7.rde +++ b/result/att7.rde @@ -5,8 +5,7 @@ 1 1 test 1 0 1 14 #text 0 1 -1 1 test 0 0 -1 15 test 0 0 +1 1 test 1 0 1 14 #text 0 1 0 15 x 0 0 diff --git a/result/ent9.rde b/result/ent9.rde index 38b9f431..22061467 100644 --- a/result/ent9.rde +++ b/result/ent9.rde @@ -12,8 +12,7 @@ 2 1 c 0 0 2 15 c 0 0 2 3 #text 0 1 , -2 1 d 0 0 -2 15 d 0 0 +2 1 d 1 0 1 15 ent 0 0 1 14 #text 0 1 @@ -292,8 +291,7 @@ 2 1 c 0 0 2 15 c 0 0 2 3 #text 0 1 , -2 1 d 0 0 -2 15 d 0 0 +2 1 d 1 0 1 15 ent 0 0 1 14 #text 0 1 |