fixed a very serious (looping) validation bug Daniel
* parser.c valid.c result/valid/rss.xml result/valid/rss.xml.err:
fixed a very serious (looping) validation bug
Daniel
diff --git a/ChangeLog b/ChangeLog
index eb73e8e..5ccff72 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Oct 18 16:56:23 CEST 2001 Daniel Veillard <daniel@veillard.com>
+
+ * parser.c valid.c result/valid/rss.xml result/valid/rss.xml.err:
+ fixed a very serious (looping) validation bug
+
Wed Oct 17 11:56:25 EDT 2001 Daniel Veillard <daniel@veillard.com>
* include/libxml/globals.h include/libxml/threads.h threads.c
diff --git a/parser.c b/parser.c
index df21992..0a580f5 100644
--- a/parser.c
+++ b/parser.c
@@ -4443,12 +4443,54 @@
ret->ocur = XML_ELEMENT_CONTENT_OPT;
NEXT;
} else if (RAW == '*') {
- if (ret != NULL)
+ if (ret != NULL) {
ret->ocur = XML_ELEMENT_CONTENT_MULT;
+ cur = ret;
+ /*
+ * Some normalization:
+ * (a | b* | c?)* == (a | b | c)*
+ */
+ while (cur->type == XML_ELEMENT_CONTENT_OR) {
+ if ((cur->c1 != NULL) &&
+ ((cur->c1->ocur == XML_ELEMENT_CONTENT_OPT) ||
+ (cur->c1->ocur == XML_ELEMENT_CONTENT_MULT)))
+ cur->c1->ocur = XML_ELEMENT_CONTENT_ONCE;
+ if ((cur->c2 != NULL) &&
+ ((cur->c2->ocur == XML_ELEMENT_CONTENT_OPT) ||
+ (cur->c2->ocur == XML_ELEMENT_CONTENT_MULT)))
+ cur->c2->ocur = XML_ELEMENT_CONTENT_ONCE;
+ cur = cur->c2;
+ }
+ }
NEXT;
} else if (RAW == '+') {
- if (ret != NULL)
+ if (ret != NULL) {
+ int found = 0;
+
ret->ocur = XML_ELEMENT_CONTENT_PLUS;
+ /*
+ * Some normalization:
+ * (a | b*)+ == (a | b)*
+ * (a | b?)+ == (a | b)*
+ */
+ while (cur->type == XML_ELEMENT_CONTENT_OR) {
+ if ((cur->c1 != NULL) &&
+ ((cur->c1->ocur == XML_ELEMENT_CONTENT_OPT) ||
+ (cur->c1->ocur == XML_ELEMENT_CONTENT_MULT))) {
+ cur->c1->ocur = XML_ELEMENT_CONTENT_ONCE;
+ found = 1;
+ }
+ if ((cur->c2 != NULL) &&
+ ((cur->c2->ocur == XML_ELEMENT_CONTENT_OPT) ||
+ (cur->c2->ocur == XML_ELEMENT_CONTENT_MULT))) {
+ cur->c2->ocur = XML_ELEMENT_CONTENT_ONCE;
+ found = 1;
+ }
+ cur = cur->c2;
+ }
+ if (found)
+ ret->ocur = XML_ELEMENT_CONTENT_MULT;
+ }
NEXT;
}
return(ret);
diff --git a/result/valid/rss.xml b/result/valid/rss.xml
index ee5145f..d3d1aad 100644
--- a/result/valid/rss.xml
+++ b/result/valid/rss.xml
@@ -17,15 +17,15 @@
Based on RSS DTD originally created by
Lars Marius Garshol - larsga@ifi.uio.no.
- $Id: rss-0.91.dtd,v 1.1 1999/07/25 07:59:31 danda Exp $
+ $Id: rss.xml,v 1.1 2001/04/20 13:48:21 veillard Exp $
--><!ELEMENT rss (channel)>
<!ATTLIST rss version CDATA #REQUIRED>
-<!-- must be "0.91"> --><!ELEMENT channel (title | description | link | language | item+ | rating? | image? | textinput? | copyright? | pubDate? | lastBuildDate? | docs? | managingEditor? | webMaster? | skipHours? | skipDays?)*>
+<!-- must be "0.91"> --><!ELEMENT channel (title | description | link | language | item+ | rating | image | textinput | copyright | pubDate | lastBuildDate | docs | managingEditor | webMaster | skipHours | skipDays)*>
<!ELEMENT title (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT link (#PCDATA)>
-<!ELEMENT image (title | url | link | width? | height? | description?)*>
+<!ELEMENT image (title | url | link | width | height | description)*>
<!ELEMENT url (#PCDATA)>
<!ELEMENT item (title | link | description)*>
<!ELEMENT textinput (title | description | name | link)*>
diff --git a/valid.c b/valid.c
index a8b4b4c..c894ff6 100644
--- a/valid.c
+++ b/valid.c
@@ -199,6 +199,11 @@
case XML_HTML_DOCUMENT_NODE:
xmlGenericError(xmlGenericErrorContext, "?html? ");
break;
+#ifdef LIBXML_DOCB_ENABLED
+ case XML_DOCB_DOCUMENT_NODE:
+ xmlGenericError(xmlGenericErrorContext, "?docb? ");
+ break;
+#endif
case XML_DTD_NODE:
xmlGenericError(xmlGenericErrorContext, "?dtd? ");
break;
@@ -3395,6 +3400,8 @@
* of handling epsilon transition in NFAs.
*/
if ((CONT != NULL) &&
+ ((CONT->parent == NULL) ||
+ (CONT->parent->type != XML_ELEMENT_CONTENT_OR)) &&
((CONT->ocur == XML_ELEMENT_CONTENT_MULT) ||
(CONT->ocur == XML_ELEMENT_CONTENT_OPT) ||
((CONT->ocur == XML_ELEMENT_CONTENT_PLUS) && (OCCURENCE)))) {
@@ -3600,7 +3607,7 @@
break;
}
DEBUG_VALID_MSG("Mult branch succeeded, continuing");
- SET_OCCURENCE;
+ /* SET_OCCURENCE; */
goto cont;
}
}