mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-10-23 01:52:48 +03:00
parser: Don't overwrite catastrophic errors
Stop reporting errors after a catastrophic error. Also make sure that ctxt->errNo matches ctxt->lastError.code.
This commit is contained in:
@@ -67,6 +67,10 @@ xmlWarningMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error,
|
|||||||
const char *msg, const xmlChar *str1, const xmlChar *str2);
|
const char *msg, const xmlChar *str1, const xmlChar *str2);
|
||||||
XML_HIDDEN void
|
XML_HIDDEN void
|
||||||
xmlCtxtErrIO(xmlParserCtxtPtr ctxt, int code, const char *uri);
|
xmlCtxtErrIO(xmlParserCtxtPtr ctxt, int code, const char *uri);
|
||||||
|
XML_HIDDEN int
|
||||||
|
xmlIsCatastrophicError(int level, int code);
|
||||||
|
XML_HIDDEN int
|
||||||
|
xmlCtxtIsCatastrophicError(xmlParserCtxtPtr ctxt);
|
||||||
|
|
||||||
XML_HIDDEN void
|
XML_HIDDEN void
|
||||||
xmlHaltParser(xmlParserCtxtPtr ctxt);
|
xmlHaltParser(xmlParserCtxtPtr ctxt);
|
||||||
|
@@ -254,19 +254,13 @@ xmlCtxtErrIO(xmlParserCtxtPtr ctxt, int code, const char *uri)
|
|||||||
msg, str1, str2);
|
msg, str1, str2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int
|
||||||
xmlCtxtIsCatastrophicError(xmlParserCtxtPtr ctxt) {
|
xmlIsCatastrophicError(int level, int code) {
|
||||||
int fatal = 0;
|
int fatal = 0;
|
||||||
int code;
|
|
||||||
|
|
||||||
if (ctxt == NULL)
|
if (level != XML_ERR_FATAL)
|
||||||
return(1);
|
|
||||||
|
|
||||||
if (ctxt->lastError.level != XML_ERR_FATAL)
|
|
||||||
return(0);
|
return(0);
|
||||||
|
|
||||||
code = ctxt->lastError.code;
|
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case XML_ERR_NO_MEMORY:
|
case XML_ERR_NO_MEMORY:
|
||||||
case XML_ERR_RESOURCE_LIMIT:
|
case XML_ERR_RESOURCE_LIMIT:
|
||||||
@@ -284,6 +278,15 @@ xmlCtxtIsCatastrophicError(xmlParserCtxtPtr ctxt) {
|
|||||||
return(fatal);
|
return(fatal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
xmlCtxtIsCatastrophicError(xmlParserCtxtPtr ctxt) {
|
||||||
|
if (ctxt == NULL)
|
||||||
|
return(1);
|
||||||
|
|
||||||
|
return(xmlIsCatastrophicError(ctxt->lastError.level,
|
||||||
|
ctxt->lastError.code));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* xmlCtxtVErr:
|
* xmlCtxtVErr:
|
||||||
* @ctxt: a parser context
|
* @ctxt: a parser context
|
||||||
@@ -325,15 +328,20 @@ xmlCtxtVErr(xmlParserCtxtPtr ctxt, xmlNodePtr node, xmlErrorDomain domain,
|
|||||||
if (PARSER_STOPPED(ctxt))
|
if (PARSER_STOPPED(ctxt))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Don't overwrite catastrophic errors */
|
||||||
|
if (xmlCtxtIsCatastrophicError(ctxt))
|
||||||
|
return;
|
||||||
|
|
||||||
if (level == XML_ERR_WARNING) {
|
if (level == XML_ERR_WARNING) {
|
||||||
if (ctxt->nbWarnings >= XML_MAX_ERRORS)
|
if (ctxt->nbWarnings >= XML_MAX_ERRORS)
|
||||||
goto done;
|
return;
|
||||||
ctxt->nbWarnings += 1;
|
ctxt->nbWarnings += 1;
|
||||||
} else {
|
} else {
|
||||||
/* Report at least one fatal error. */
|
/* Report at least one fatal error. */
|
||||||
if ((ctxt->nbErrors >= XML_MAX_ERRORS) &&
|
if ((ctxt->nbErrors >= XML_MAX_ERRORS) &&
|
||||||
((level < XML_ERR_FATAL) || (ctxt->wellFormed == 0)))
|
((level < XML_ERR_FATAL) || (ctxt->wellFormed == 0)) &&
|
||||||
goto done;
|
(!xmlIsCatastrophicError(level, code)))
|
||||||
|
return;
|
||||||
ctxt->nbErrors += 1;
|
ctxt->nbErrors += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -384,7 +392,6 @@ xmlCtxtVErr(xmlParserCtxtPtr ctxt, xmlNodePtr node, xmlErrorDomain domain,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
|
||||||
if (level >= XML_ERR_ERROR)
|
if (level >= XML_ERR_ERROR)
|
||||||
ctxt->errNo = code;
|
ctxt->errNo = code;
|
||||||
if (level == XML_ERR_FATAL) {
|
if (level == XML_ERR_FATAL) {
|
||||||
|
Reference in New Issue
Block a user