mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-29 11:41:22 +03:00
html: Fix check for end of comment in push parser
Make sure to reset checkIndex. Handle case where "--" or "--!" is at the end of the buffer. Fix "avail" check in htmlParseOrTryFinish.
This commit is contained in:
20
HTMLparser.c
20
HTMLparser.c
@ -5411,14 +5411,22 @@ static int
|
|||||||
htmlParseLookupCommentEnd(htmlParserCtxtPtr ctxt)
|
htmlParseLookupCommentEnd(htmlParserCtxtPtr ctxt)
|
||||||
{
|
{
|
||||||
int mark = 0;
|
int mark = 0;
|
||||||
|
int offset;
|
||||||
|
|
||||||
while (mark >= 0) {
|
while (1) {
|
||||||
mark = htmlParseLookupSequence(ctxt, '-', '-', 0, 0);
|
mark = htmlParseLookupSequence(ctxt, '-', '-', 0, 0);
|
||||||
if ((mark < 0) ||
|
if (mark < 0)
|
||||||
(NXT(mark+2) == '>') ||
|
break;
|
||||||
|
if ((NXT(mark+2) == '>') ||
|
||||||
((NXT(mark+2) == '!') && (NXT(mark+3) == '>'))) {
|
((NXT(mark+2) == '!') && (NXT(mark+3) == '>'))) {
|
||||||
return mark;
|
ctxt->checkIndex = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
offset = (NXT(mark+2) == '!') ? 3 : 2;
|
||||||
|
if (mark + offset >= ctxt->input->end - ctxt->input->cur) {
|
||||||
|
ctxt->checkIndex = mark;
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
ctxt->checkIndex = mark + 1;
|
ctxt->checkIndex = mark + 1;
|
||||||
}
|
}
|
||||||
return mark;
|
return mark;
|
||||||
@ -5954,6 +5962,8 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if ((cur == '<') && (next == '!')) {
|
} else if ((cur == '<') && (next == '!')) {
|
||||||
|
if (avail < 4)
|
||||||
|
goto done;
|
||||||
/*
|
/*
|
||||||
* Sometimes DOCTYPE arrives in the middle of the document
|
* Sometimes DOCTYPE arrives in the middle of the document
|
||||||
*/
|
*/
|
||||||
@ -5994,8 +6004,6 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) {
|
|||||||
#endif
|
#endif
|
||||||
htmlParsePI(ctxt);
|
htmlParsePI(ctxt);
|
||||||
ctxt->instate = XML_PARSER_CONTENT;
|
ctxt->instate = XML_PARSER_CONTENT;
|
||||||
} else if ((cur == '<') && (next == '!') && (avail < 4)) {
|
|
||||||
goto done;
|
|
||||||
} else if ((cur == '<') && (next == '/')) {
|
} else if ((cur == '<') && (next == '/')) {
|
||||||
ctxt->instate = XML_PARSER_END_TAG;
|
ctxt->instate = XML_PARSER_END_TAG;
|
||||||
ctxt->checkIndex = 0;
|
ctxt->checkIndex = 0;
|
||||||
|
Reference in New Issue
Block a user