1
0
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:
Nick Wellnhofer
2024-11-25 20:59:06 +01:00
parent 5737466a31
commit 57087e5fc7
2 changed files with 24 additions and 13 deletions

View File

@@ -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);

View File

@@ -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) {