diff --git a/ChangeLog b/ChangeLog index eb73e8ea..5ccff722 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Oct 18 16:56:23 CEST 2001 Daniel Veillard + + * 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 * include/libxml/globals.h include/libxml/threads.h threads.c diff --git a/parser.c b/parser.c index df21992f..0a580f50 100644 --- a/parser.c +++ b/parser.c @@ -4443,12 +4443,54 @@ xmlParseElementChildrenContentDecl 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 ee5145f0..d3d1aad2 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 $ --> - + - + diff --git a/valid.c b/valid.c index a8b4b4cc..c894ff68 100644 --- a/valid.c +++ b/valid.c @@ -199,6 +199,11 @@ xmlValidPrintNode(xmlNodePtr cur) { 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 @@ cont: * 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 @@ analyze: break; } DEBUG_VALID_MSG("Mult branch succeeded, continuing"); - SET_OCCURENCE; + /* SET_OCCURENCE; */ goto cont; } }