136 lines
4.0 KiB
Diff
136 lines
4.0 KiB
Diff
|
|
From f9ea1a24ed0fd2fd051bb01b0d08cdff60887938 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Nick Wellnhofer <wellnhofer@aevum.de>
|
||
|
|
Date: Tue, 11 Feb 2020 16:17:34 +0100
|
||
|
|
Subject: [PATCH] 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.)
|
||
|
|
---
|
||
|
|
parser.c | 64 +++++++++++++++++++++++++++------------------------------
|
||
|
|
result/att7.rde | 3 +--
|
||
|
|
result/ent9.rde | 6 ++----
|
||
|
|
3 files changed, 33 insertions(+), 40 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/parser.c b/parser.c
|
||
|
|
index 1ba988c..5ff8592 100644
|
||
|
|
--- a/parser.c
|
||
|
|
+++ b/parser.c
|
||
|
|
@@ -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 afcef5f..6079637 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 38b9f43..2206146 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
|
||
|
|
|
||
|
|
--
|
||
|
|
1.8.3.1
|
||
|
|
|