mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-08-08 17:42:14 +03:00
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
This commit is contained in:
@@ -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>
|
Wed Oct 17 11:56:25 EDT 2001 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
* include/libxml/globals.h include/libxml/threads.h threads.c
|
* include/libxml/globals.h include/libxml/threads.h threads.c
|
||||||
|
46
parser.c
46
parser.c
@@ -4443,12 +4443,54 @@ xmlParseElementChildrenContentDecl
|
|||||||
ret->ocur = XML_ELEMENT_CONTENT_OPT;
|
ret->ocur = XML_ELEMENT_CONTENT_OPT;
|
||||||
NEXT;
|
NEXT;
|
||||||
} else if (RAW == '*') {
|
} else if (RAW == '*') {
|
||||||
if (ret != NULL)
|
if (ret != NULL) {
|
||||||
ret->ocur = XML_ELEMENT_CONTENT_MULT;
|
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;
|
NEXT;
|
||||||
} else if (RAW == '+') {
|
} else if (RAW == '+') {
|
||||||
if (ret != NULL)
|
if (ret != NULL) {
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
ret->ocur = XML_ELEMENT_CONTENT_PLUS;
|
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;
|
NEXT;
|
||||||
}
|
}
|
||||||
return(ret);
|
return(ret);
|
||||||
|
@@ -17,15 +17,15 @@
|
|||||||
|
|
||||||
Based on RSS DTD originally created by
|
Based on RSS DTD originally created by
|
||||||
Lars Marius Garshol - larsga@ifi.uio.no.
|
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)>
|
--><!ELEMENT rss (channel)>
|
||||||
<!ATTLIST rss version CDATA #REQUIRED>
|
<!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 title (#PCDATA)>
|
||||||
<!ELEMENT description (#PCDATA)>
|
<!ELEMENT description (#PCDATA)>
|
||||||
<!ELEMENT link (#PCDATA)>
|
<!ELEMENT link (#PCDATA)>
|
||||||
<!ELEMENT image (title | url | link | width? | height? | description?)*>
|
<!ELEMENT image (title | url | link | width | height | description)*>
|
||||||
<!ELEMENT url (#PCDATA)>
|
<!ELEMENT url (#PCDATA)>
|
||||||
<!ELEMENT item (title | link | description)*>
|
<!ELEMENT item (title | link | description)*>
|
||||||
<!ELEMENT textinput (title | description | name | link)*>
|
<!ELEMENT textinput (title | description | name | link)*>
|
||||||
|
9
valid.c
9
valid.c
@@ -199,6 +199,11 @@ xmlValidPrintNode(xmlNodePtr cur) {
|
|||||||
case XML_HTML_DOCUMENT_NODE:
|
case XML_HTML_DOCUMENT_NODE:
|
||||||
xmlGenericError(xmlGenericErrorContext, "?html? ");
|
xmlGenericError(xmlGenericErrorContext, "?html? ");
|
||||||
break;
|
break;
|
||||||
|
#ifdef LIBXML_DOCB_ENABLED
|
||||||
|
case XML_DOCB_DOCUMENT_NODE:
|
||||||
|
xmlGenericError(xmlGenericErrorContext, "?docb? ");
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case XML_DTD_NODE:
|
case XML_DTD_NODE:
|
||||||
xmlGenericError(xmlGenericErrorContext, "?dtd? ");
|
xmlGenericError(xmlGenericErrorContext, "?dtd? ");
|
||||||
break;
|
break;
|
||||||
@@ -3395,6 +3400,8 @@ cont:
|
|||||||
* of handling epsilon transition in NFAs.
|
* of handling epsilon transition in NFAs.
|
||||||
*/
|
*/
|
||||||
if ((CONT != NULL) &&
|
if ((CONT != NULL) &&
|
||||||
|
((CONT->parent == NULL) ||
|
||||||
|
(CONT->parent->type != XML_ELEMENT_CONTENT_OR)) &&
|
||||||
((CONT->ocur == XML_ELEMENT_CONTENT_MULT) ||
|
((CONT->ocur == XML_ELEMENT_CONTENT_MULT) ||
|
||||||
(CONT->ocur == XML_ELEMENT_CONTENT_OPT) ||
|
(CONT->ocur == XML_ELEMENT_CONTENT_OPT) ||
|
||||||
((CONT->ocur == XML_ELEMENT_CONTENT_PLUS) && (OCCURENCE)))) {
|
((CONT->ocur == XML_ELEMENT_CONTENT_PLUS) && (OCCURENCE)))) {
|
||||||
@@ -3600,7 +3607,7 @@ analyze:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
DEBUG_VALID_MSG("Mult branch succeeded, continuing");
|
DEBUG_VALID_MSG("Mult branch succeeded, continuing");
|
||||||
SET_OCCURENCE;
|
/* SET_OCCURENCE; */
|
||||||
goto cont;
|
goto cont;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user