mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-10-26 00:37:43 +03:00
save: Fix handling of catastrophic errors
Don't overwrite catastrophic errors xmlSaveErr. Overwrite non-catastrophic errors in xmlOutputBufferClose.
This commit is contained in:
24
error.c
24
error.c
@@ -20,6 +20,30 @@
|
|||||||
#include "private/globals.h"
|
#include "private/globals.h"
|
||||||
#include "private/string.h"
|
#include "private/string.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
xmlIsCatastrophicError(int level, int code) {
|
||||||
|
int fatal = 0;
|
||||||
|
|
||||||
|
if (level != XML_ERR_FATAL)
|
||||||
|
return(0);
|
||||||
|
|
||||||
|
switch (code) {
|
||||||
|
case XML_ERR_NO_MEMORY:
|
||||||
|
/* case XML_ERR_RESOURCE_LIMIT: */
|
||||||
|
case XML_ERR_SYSTEM:
|
||||||
|
case XML_ERR_ARGUMENT:
|
||||||
|
case XML_ERR_INTERNAL_ERROR:
|
||||||
|
fatal = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if ((code >= 1500) && (code <= 1599))
|
||||||
|
fatal = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(fatal);
|
||||||
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* *
|
* *
|
||||||
* Error struct *
|
* Error struct *
|
||||||
|
|||||||
@@ -10,6 +10,9 @@
|
|||||||
|
|
||||||
struct _xmlNode;
|
struct _xmlNode;
|
||||||
|
|
||||||
|
XML_HIDDEN int
|
||||||
|
xmlIsCatastrophicError(int level, int code);
|
||||||
|
|
||||||
XML_HIDDEN void
|
XML_HIDDEN void
|
||||||
xmlRaiseMemoryError(xmlStructuredErrorFunc schannel, xmlGenericErrorFunc channel,
|
xmlRaiseMemoryError(xmlStructuredErrorFunc schannel, xmlGenericErrorFunc channel,
|
||||||
void *data, int domain, xmlError *error);
|
void *data, int domain, xmlError *error);
|
||||||
|
|||||||
@@ -68,8 +68,6 @@ xmlWarningMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error,
|
|||||||
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
|
XML_HIDDEN int
|
||||||
xmlIsCatastrophicError(int level, int code);
|
|
||||||
XML_HIDDEN int
|
|
||||||
xmlCtxtIsCatastrophicError(xmlParserCtxtPtr ctxt);
|
xmlCtxtIsCatastrophicError(xmlParserCtxtPtr ctxt);
|
||||||
|
|
||||||
XML_HIDDEN void
|
XML_HIDDEN void
|
||||||
|
|||||||
@@ -256,30 +256,6 @@ xmlCtxtErrIO(xmlParserCtxtPtr ctxt, int code, const char *uri)
|
|||||||
msg, str1, str2);
|
msg, str1, str2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
xmlIsCatastrophicError(int level, int code) {
|
|
||||||
int fatal = 0;
|
|
||||||
|
|
||||||
if (level != XML_ERR_FATAL)
|
|
||||||
return(0);
|
|
||||||
|
|
||||||
switch (code) {
|
|
||||||
case XML_ERR_NO_MEMORY:
|
|
||||||
/* case XML_ERR_RESOURCE_LIMIT: */
|
|
||||||
case XML_ERR_SYSTEM:
|
|
||||||
case XML_ERR_ARGUMENT:
|
|
||||||
case XML_ERR_INTERNAL_ERROR:
|
|
||||||
fatal = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if ((code >= 1500) && (code <= 1599))
|
|
||||||
fatal = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(fatal);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
xmlCtxtIsCatastrophicError(xmlParserCtxtPtr ctxt) {
|
xmlCtxtIsCatastrophicError(xmlParserCtxtPtr ctxt) {
|
||||||
if (ctxt == NULL)
|
if (ctxt == NULL)
|
||||||
|
|||||||
3
xmlIO.c
3
xmlIO.c
@@ -1341,7 +1341,8 @@ xmlOutputBufferClose(xmlOutputBufferPtr out)
|
|||||||
if (out->closecallback != NULL) {
|
if (out->closecallback != NULL) {
|
||||||
int code = out->closecallback(out->context);
|
int code = out->closecallback(out->context);
|
||||||
|
|
||||||
if ((code != XML_ERR_OK) && (out->error == XML_ERR_OK)) {
|
if ((code != XML_ERR_OK) &&
|
||||||
|
(!xmlIsCatastrophicError(XML_ERR_FATAL, out->error))) {
|
||||||
if (code < 0)
|
if (code < 0)
|
||||||
out->error = XML_IO_UNKNOWN;
|
out->error = XML_IO_UNKNOWN;
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -83,8 +83,10 @@ xmlSaveErr(xmlOutputBufferPtr out, int code, xmlNodePtr node,
|
|||||||
const char *msg = NULL;
|
const char *msg = NULL;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
/* Don't overwrite memory errors */
|
/* Don't overwrite catastrophic errors */
|
||||||
if ((out != NULL) && (out->error == XML_ERR_NO_MEMORY))
|
if ((out != NULL) &&
|
||||||
|
(out->error != XML_ERR_OK) &&
|
||||||
|
(xmlIsCatastrophicError(XML_ERR_FATAL, out->error)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (code == XML_ERR_NO_MEMORY) {
|
if (code == XML_ERR_NO_MEMORY) {
|
||||||
|
|||||||
Reference in New Issue
Block a user