aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Veillard <veillard@src.gnome.org>2008-03-07 16:50:21 +0000
committerDaniel Veillard <veillard@src.gnome.org>2008-03-07 16:50:21 +0000
commitd0d2f090dcb4774998716988255753f965912d73 (patch)
treecd8fe05a7e394a5d99f17b3237155962b724a868
parent57c9db0725d63b27709a9f040888b160f29573a3 (diff)
downloadandroid_external_libxml2-d0d2f090dcb4774998716988255753f965912d73.tar.gz
android_external_libxml2-d0d2f090dcb4774998716988255753f965912d73.tar.bz2
android_external_libxml2-d0d2f090dcb4774998716988255753f965912d73.zip
fix handling of empty CDATA nodes as reported and discussed around #514181
* xmlsave.c parser.c: fix handling of empty CDATA nodes as reported and discussed around #514181 and associated patches * test/emptycdata.xml result/emptycdata.xml* result/noent/emptycdata.xml: added a specific test in the regression suite. Daniel svn path=/trunk/; revision=3701
-rw-r--r--ChangeLog8
-rw-r--r--parser.c15
-rw-r--r--result/emptycdata.xml4
-rw-r--r--result/emptycdata.xml.rde7
-rw-r--r--result/emptycdata.xml.rdr7
-rw-r--r--result/emptycdata.xml.sax10
-rw-r--r--result/emptycdata.xml.sax210
-rw-r--r--result/noent/emptycdata.xml4
-rw-r--r--test/emptycdata.xml4
-rw-r--r--xmlsave.c32
10 files changed, 86 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index fd7ddbf0..0d7570cb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Fri Mar 7 17:45:27 CET 2008 Daniel Veillard <daniel@veillard.com>
+
+ * xmlsave.c parser.c: fix handling of empty CDATA nodes as
+ reported and discussed around #514181 and associated patches
+ * test/emptycdata.xml result/emptycdata.xml*
+ result/noent/emptycdata.xml: added a specific test in the
+ regression suite.
+
Thu Mar 6 15:23:10 CET 2008 Daniel Veillard <daniel@veillard.com>
* encoding.c: poblem with encoding detection for UTF-16 reported by
diff --git a/parser.c b/parser.c
index 0d27e87e..5dc6d01d 100644
--- a/parser.c
+++ b/parser.c
@@ -10165,7 +10165,20 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) {
ctxt->input->cur += tmp;
goto encoding_error;
}
- if ((ctxt->sax != NULL) && (base > 0) &&
+ if ((ctxt->sax != NULL) && (base == 0) &&
+ (ctxt->sax->cdataBlock != NULL) &&
+ (!ctxt->disableSAX)) {
+ /*
+ * Special case to provide identical behaviour
+ * between pull and push parsers on enpty CDATA
+ * sections
+ */
+ if ((ctxt->input->cur - ctxt->input->base >= 9) &&
+ (!strncmp((const char *)&ctxt->input->cur[-9],
+ "<![CDATA[", 9)))
+ ctxt->sax->cdataBlock(ctxt->userData,
+ BAD_CAST "", 0);
+ } else if ((ctxt->sax != NULL) && (base > 0) &&
(!ctxt->disableSAX)) {
if (ctxt->sax->cdataBlock != NULL)
ctxt->sax->cdataBlock(ctxt->userData,
diff --git a/result/emptycdata.xml b/result/emptycdata.xml
new file mode 100644
index 00000000..bc98388a
--- /dev/null
+++ b/result/emptycdata.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<![CDATA[]]>
+</html>
diff --git a/result/emptycdata.xml.rde b/result/emptycdata.xml.rde
new file mode 100644
index 00000000..1c8b74ff
--- /dev/null
+++ b/result/emptycdata.xml.rde
@@ -0,0 +1,7 @@
+0 1 html 0 0
+1 14 #text 0 1
+
+1 4 #cdata-section 0 1
+1 14 #text 0 1
+
+0 15 html 0 0
diff --git a/result/emptycdata.xml.rdr b/result/emptycdata.xml.rdr
new file mode 100644
index 00000000..1c8b74ff
--- /dev/null
+++ b/result/emptycdata.xml.rdr
@@ -0,0 +1,7 @@
+0 1 html 0 0
+1 14 #text 0 1
+
+1 4 #cdata-section 0 1
+1 14 #text 0 1
+
+0 15 html 0 0
diff --git a/result/emptycdata.xml.sax b/result/emptycdata.xml.sax
new file mode 100644
index 00000000..39587c63
--- /dev/null
+++ b/result/emptycdata.xml.sax
@@ -0,0 +1,10 @@
+SAX.setDocumentLocator()
+SAX.startDocument()
+SAX.startElement(html, xmlns='http://www.w3.org/1999/xhtml')
+SAX.characters(
+, 1)
+SAX.pcdata(, 0)
+SAX.characters(
+, 1)
+SAX.endElement(html)
+SAX.endDocument()
diff --git a/result/emptycdata.xml.sax2 b/result/emptycdata.xml.sax2
new file mode 100644
index 00000000..7f80296e
--- /dev/null
+++ b/result/emptycdata.xml.sax2
@@ -0,0 +1,10 @@
+SAX.setDocumentLocator()
+SAX.startDocument()
+SAX.startElementNs(html, NULL, 'http://www.w3.org/1999/xhtml', 1, xmlns='http://www.w3.org/1999/xhtml', 0, 0)
+SAX.characters(
+, 1)
+SAX.pcdata(, 0)
+SAX.characters(
+, 1)
+SAX.endElementNs(html, NULL, 'http://www.w3.org/1999/xhtml')
+SAX.endDocument()
diff --git a/result/noent/emptycdata.xml b/result/noent/emptycdata.xml
new file mode 100644
index 00000000..bc98388a
--- /dev/null
+++ b/result/noent/emptycdata.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<![CDATA[]]>
+</html>
diff --git a/test/emptycdata.xml b/test/emptycdata.xml
new file mode 100644
index 00000000..bc98388a
--- /dev/null
+++ b/test/emptycdata.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<![CDATA[]]>
+</html>
diff --git a/xmlsave.c b/xmlsave.c
index cbabd786..2a61577f 100644
--- a/xmlsave.c
+++ b/xmlsave.c
@@ -727,8 +727,8 @@ xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
return;
}
if (cur->type == XML_CDATA_SECTION_NODE) {
- if (cur->content == NULL) {
- xmlOutputBufferWrite(buf, 12, "<![CDATA[]]>");
+ if (cur->content == NULL || *cur->content == '\0') {
+ xmlOutputBufferWrite(buf, 12, "<![CDATA[]]>");
} else {
start = end = cur->content;
while (*end != '\0') {
@@ -1236,21 +1236,25 @@ xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
return;
}
if (cur->type == XML_CDATA_SECTION_NODE) {
- start = end = cur->content;
- while (*end != '\0') {
- if (*end == ']' && *(end + 1) == ']' && *(end + 2) == '>') {
- end = end + 2;
+ if (cur->content == NULL || *cur->content == '\0') {
+ xmlOutputBufferWrite(buf, 12, "<![CDATA[]]>");
+ } else {
+ start = end = cur->content;
+ while (*end != '\0') {
+ if (*end == ']' && *(end + 1) == ']' && *(end + 2) == '>') {
+ end = end + 2;
+ xmlOutputBufferWrite(buf, 9, "<![CDATA[");
+ xmlOutputBufferWrite(buf, end - start, (const char *)start);
+ xmlOutputBufferWrite(buf, 3, "]]>");
+ start = end;
+ }
+ end++;
+ }
+ if (start != end) {
xmlOutputBufferWrite(buf, 9, "<![CDATA[");
- xmlOutputBufferWrite(buf, end - start, (const char *)start);
+ xmlOutputBufferWriteString(buf, (const char *)start);
xmlOutputBufferWrite(buf, 3, "]]>");
- start = end;
}
- end++;
- }
- if (start != end) {
- xmlOutputBufferWrite(buf, 9, "<![CDATA[");
- xmlOutputBufferWriteString(buf, (const char *)start);
- xmlOutputBufferWrite(buf, 3, "]]>");
}
return;
}