1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-10-24 13:33:01 +03:00

parser: Improve error handling

Introduce xmlCtxtSetErrorHandler allowing to set a structured error for
a parser context. There already was the "serror" SAX handler but this
always receives the parser context as argument.

Start to use xmlRaiseMemoryError.

Remove useless arguments from memory error functions. Rename
xmlErrMemory to xmlCtxtErrMemory.

Remove a few calls to xmlGenericError.

Remove support for runtime entity debugging.
This commit is contained in:
Nick Wellnhofer
2023-12-18 19:31:29 +01:00
parent c5a8aef2f6
commit 54c70ed57f
13 changed files with 350 additions and 379 deletions

View File

@@ -58,9 +58,9 @@ static void htmlParseComment(htmlParserCtxtPtr ctxt);
* Handle a redefinition of attribute error * Handle a redefinition of attribute error
*/ */
static void static void
htmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra) htmlErrMemory(xmlParserCtxtPtr ctxt)
{ {
xmlErrMemory(ctxt, extra); xmlCtxtErrMemory(ctxt);
} }
/** /**
@@ -127,7 +127,7 @@ htmlnamePush(htmlParserCtxtPtr ctxt, const xmlChar * value)
tmp = xmlRealloc((xmlChar **) ctxt->nameTab, tmp = xmlRealloc((xmlChar **) ctxt->nameTab,
newSize * sizeof(ctxt->nameTab[0])); newSize * sizeof(ctxt->nameTab[0]));
if (tmp == NULL) { if (tmp == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
return (-1); return (-1);
} }
ctxt->nameTab = tmp; ctxt->nameTab = tmp;
@@ -185,7 +185,7 @@ htmlNodeInfoPush(htmlParserCtxtPtr ctxt, htmlParserNodeInfo *value)
ctxt->nodeInfoMax * ctxt->nodeInfoMax *
sizeof(ctxt->nodeInfoTab[0])); sizeof(ctxt->nodeInfoTab[0]));
if (ctxt->nodeInfoTab == NULL) { if (ctxt->nodeInfoTab == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
return (0); return (0);
} }
} }
@@ -343,7 +343,7 @@ htmlFindEncoding(xmlParserCtxtPtr ctxt) {
return(NULL); return(NULL);
ret = xmlStrndup(start, cur - start); ret = xmlStrndup(start, cur - start);
if (ret == NULL) if (ret == NULL)
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
return(ret); return(ret);
} }
@@ -1996,7 +1996,7 @@ static const htmlEntityDesc html40EntitiesTable[] = {
buffer##_size *= 2; \ buffer##_size *= 2; \
tmp = (xmlChar *) xmlRealloc(buffer, buffer##_size); \ tmp = (xmlChar *) xmlRealloc(buffer, buffer##_size); \
if (tmp == NULL) { \ if (tmp == NULL) { \
htmlErrMemory(ctxt, "growing buffer\n"); \ htmlErrMemory(ctxt); \
xmlFree(buffer); \ xmlFree(buffer); \
return(NULL); \ return(NULL); \
} \ } \
@@ -2273,7 +2273,7 @@ htmlNewInputStream(htmlParserCtxtPtr ctxt) {
input = (xmlParserInputPtr) xmlMalloc(sizeof(htmlParserInput)); input = (xmlParserInputPtr) xmlMalloc(sizeof(htmlParserInput));
if (input == NULL) { if (input == NULL) {
htmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); htmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
memset(input, 0, sizeof(htmlParserInput)); memset(input, 0, sizeof(htmlParserInput));
@@ -2518,7 +2518,7 @@ htmlParseHTMLName(htmlParserCtxtPtr ctxt) {
ret = xmlDictLookup(ctxt->dict, loc, i); ret = xmlDictLookup(ctxt->dict, loc, i);
if (ret == NULL) if (ret == NULL)
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
return(ret); return(ret);
} }
@@ -2554,7 +2554,7 @@ htmlParseHTMLName_nonInvasive(htmlParserCtxtPtr ctxt) {
ret = xmlDictLookup(ctxt->dict, loc, i); ret = xmlDictLookup(ctxt->dict, loc, i);
if (ret == NULL) if (ret == NULL)
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
return(ret); return(ret);
} }
@@ -2599,7 +2599,7 @@ htmlParseName(htmlParserCtxtPtr ctxt) {
count = in - ctxt->input->cur; count = in - ctxt->input->cur;
ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count);
if (ret == NULL) if (ret == NULL)
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
ctxt->input->cur = in; ctxt->input->cur = in;
ctxt->input->col += count; ctxt->input->col += count;
return(ret); return(ret);
@@ -2659,7 +2659,7 @@ htmlParseNameComplex(xmlParserCtxtPtr ctxt) {
ret = xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len); ret = xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len);
if (ret == NULL) if (ret == NULL)
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
return(ret); return(ret);
} }
@@ -2694,7 +2694,7 @@ htmlParseHTMLAttribute(htmlParserCtxtPtr ctxt, const xmlChar stop) {
buffer_size = HTML_PARSER_BUFFER_SIZE; buffer_size = HTML_PARSER_BUFFER_SIZE;
buffer = (xmlChar *) xmlMallocAtomic(buffer_size); buffer = (xmlChar *) xmlMallocAtomic(buffer_size);
if (buffer == NULL) { if (buffer == NULL) {
htmlErrMemory(ctxt, "buffer allocation failed\n"); htmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
out = buffer; out = buffer;
@@ -2959,7 +2959,7 @@ htmlParseSystemLiteral(htmlParserCtxtPtr ctxt) {
if (err == 0) { if (err == 0) {
ret = xmlStrndup((BASE_PTR+startPosition), len); ret = xmlStrndup((BASE_PTR+startPosition), len);
if (ret == NULL) { if (ret == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
} }
@@ -3020,7 +3020,7 @@ htmlParsePubidLiteral(htmlParserCtxtPtr ctxt) {
if (err == 0) { if (err == 0) {
ret = xmlStrndup((BASE_PTR + startPosition), len); ret = xmlStrndup((BASE_PTR + startPosition), len);
if (ret == NULL) { if (ret == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
} }
@@ -3330,7 +3330,7 @@ htmlParsePI(htmlParserCtxtPtr ctxt) {
} }
buf = (xmlChar *) xmlMallocAtomic(size); buf = (xmlChar *) xmlMallocAtomic(size);
if (buf == NULL) { if (buf == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
return; return;
} }
cur = CUR; cur = CUR;
@@ -3347,7 +3347,7 @@ htmlParsePI(htmlParserCtxtPtr ctxt) {
size *= 2; size *= 2;
tmp = (xmlChar *) xmlRealloc(buf, size); tmp = (xmlChar *) xmlRealloc(buf, size);
if (tmp == NULL) { if (tmp == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
xmlFree(buf); xmlFree(buf);
return; return;
} }
@@ -3428,7 +3428,7 @@ htmlParseComment(htmlParserCtxtPtr ctxt) {
SKIP(4); SKIP(4);
buf = (xmlChar *) xmlMallocAtomic(size); buf = (xmlChar *) xmlMallocAtomic(size);
if (buf == NULL) { if (buf == NULL) {
htmlErrMemory(ctxt, "buffer allocation failed\n"); htmlErrMemory(ctxt);
return; return;
} }
len = 0; len = 0;
@@ -3472,7 +3472,7 @@ htmlParseComment(htmlParserCtxtPtr ctxt) {
tmp = (xmlChar *) xmlRealloc(buf, size); tmp = (xmlChar *) xmlRealloc(buf, size);
if (tmp == NULL) { if (tmp == NULL) {
xmlFree(buf); xmlFree(buf);
htmlErrMemory(ctxt, "growing buffer failed\n"); htmlErrMemory(ctxt);
return; return;
} }
buf = tmp; buf = tmp;
@@ -3746,7 +3746,7 @@ htmlCheckEncoding(htmlParserCtxtPtr ctxt, const xmlChar *attvalue) {
encoding ++; encoding ++;
copy = xmlStrdup(encoding); copy = xmlStrdup(encoding);
if (copy == NULL) if (copy == NULL)
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
xmlSetDeclaredEncoding(ctxt, copy); xmlSetDeclaredEncoding(ctxt, copy);
} }
} }
@@ -3781,7 +3781,7 @@ htmlCheckMeta(htmlParserCtxtPtr ctxt, const xmlChar **atts) {
copy = xmlStrdup(value); copy = xmlStrdup(value);
if (copy == NULL) if (copy == NULL)
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
xmlSetDeclaredEncoding(ctxt, copy); xmlSetDeclaredEncoding(ctxt, copy);
} else if (!xmlStrcasecmp(att, BAD_CAST "content")) { } else if (!xmlStrcasecmp(att, BAD_CAST "content")) {
content = value; content = value;
@@ -3926,7 +3926,7 @@ htmlParseStartTag(htmlParserCtxtPtr ctxt) {
atts = (const xmlChar **) atts = (const xmlChar **)
xmlMalloc(maxatts * sizeof(xmlChar *)); xmlMalloc(maxatts * sizeof(xmlChar *));
if (atts == NULL) { if (atts == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
if (attvalue != NULL) if (attvalue != NULL)
xmlFree(attvalue); xmlFree(attvalue);
goto failed; goto failed;
@@ -3940,7 +3940,7 @@ htmlParseStartTag(htmlParserCtxtPtr ctxt) {
n = (const xmlChar **) xmlRealloc((void *) atts, n = (const xmlChar **) xmlRealloc((void *) atts,
maxatts * sizeof(const xmlChar *)); maxatts * sizeof(const xmlChar *));
if (n == NULL) { if (n == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
if (attvalue != NULL) if (attvalue != NULL)
xmlFree(attvalue); xmlFree(attvalue);
goto failed; goto failed;
@@ -4591,7 +4591,7 @@ htmlParseContentInternal(htmlParserCtxtPtr ctxt) {
} else { } else {
currentNode = xmlStrdup(ctxt->name); currentNode = xmlStrdup(ctxt->name);
if (currentNode == NULL) { if (currentNode == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
return; return;
} }
} }
@@ -4613,7 +4613,7 @@ htmlParseContentInternal(htmlParserCtxtPtr ctxt) {
} else { } else {
currentNode = xmlStrdup(ctxt->name); currentNode = xmlStrdup(ctxt->name);
if (currentNode == NULL) { if (currentNode == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
break; break;
} }
} }
@@ -4642,7 +4642,7 @@ htmlParseContentInternal(htmlParserCtxtPtr ctxt) {
} else { } else {
currentNode = xmlStrdup(ctxt->name); currentNode = xmlStrdup(ctxt->name);
if (currentNode == NULL) { if (currentNode == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
break; break;
} }
} }
@@ -4673,7 +4673,7 @@ htmlParseContentInternal(htmlParserCtxtPtr ctxt) {
} else { } else {
currentNode = xmlStrdup(ctxt->name); currentNode = xmlStrdup(ctxt->name);
if (currentNode == NULL) { if (currentNode == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
break; break;
} }
} }
@@ -4732,7 +4732,7 @@ htmlParseContentInternal(htmlParserCtxtPtr ctxt) {
} else { } else {
currentNode = xmlStrdup(ctxt->name); currentNode = xmlStrdup(ctxt->name);
if (currentNode == NULL) { if (currentNode == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
break; break;
} }
} }
@@ -4901,7 +4901,7 @@ htmlParseDocument(htmlParserCtxtPtr ctxt) {
BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN", BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN",
BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd"); BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd");
if (ctxt->myDoc->intSubset == NULL) if (ctxt->myDoc->intSubset == NULL)
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
} }
} }
if (! ctxt->wellFormed) return(-1); if (! ctxt->wellFormed) return(-1);
@@ -5786,7 +5786,7 @@ done:
BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN", BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN",
BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd"); BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd");
if (ctxt->myDoc->intSubset == NULL) if (ctxt->myDoc->intSubset == NULL)
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
} }
} }
return(ret); return(ret);
@@ -6722,7 +6722,7 @@ htmlCtxtReadMemory(htmlParserCtxtPtr ctxt, const char *buffer, int size,
input = xmlParserInputBufferCreateStatic(buffer, size, input = xmlParserInputBufferCreateStatic(buffer, size,
XML_CHAR_ENCODING_NONE); XML_CHAR_ENCODING_NONE);
if (input == NULL) { if (input == NULL) {
htmlErrMemory(ctxt, NULL); htmlErrMemory(ctxt);
return(NULL); return(NULL);
} }

135
SAX2.c
View File

@@ -31,29 +31,14 @@
#include "private/parser.h" #include "private/parser.h"
#include "private/tree.h" #include "private/tree.h"
/**
* TODO:
*
* macro to flag unimplemented blocks
* XML_CATALOG_PREFER user env to select between system/public preferred
* option. C.f. Richard Tobin <richard@cogsci.ed.ac.uk>
*> Just FYI, I am using an environment variable XML_CATALOG_PREFER with
*> values "system" and "public". I have made the default be "system" to
*> match yours.
*/
#define TODO \
xmlGenericError(xmlGenericErrorContext, \
"Unimplemented block at %s:%d\n", \
__FILE__, __LINE__);
/* /*
* xmlSAX2ErrMemory: * xmlSAX2ErrMemory:
* @ctxt: an XML validation parser context * @ctxt: an XML validation parser context
* @msg: a string to accompany the error message * @msg: a string to accompany the error message
*/ */
static void LIBXML_ATTR_FORMAT(2,0) static void
xmlSAX2ErrMemory(xmlParserCtxtPtr ctxt, const char *msg) { xmlSAX2ErrMemory(xmlParserCtxtPtr ctxt) {
xmlErrMemory(ctxt, msg); xmlCtxtErrMemory(ctxt);
} }
/** /**
@@ -271,7 +256,7 @@ xmlSAX2InternalSubset(void *ctx, const xmlChar *name,
ctxt->myDoc->intSubset = ctxt->myDoc->intSubset =
xmlCreateIntSubset(ctxt->myDoc, name, ExternalID, SystemID); xmlCreateIntSubset(ctxt->myDoc, name, ExternalID, SystemID);
if (ctxt->myDoc->intSubset == NULL) if (ctxt->myDoc->intSubset == NULL)
xmlSAX2ErrMemory(ctxt, "xmlSAX2InternalSubset"); xmlSAX2ErrMemory(ctxt);
} }
/** /**
@@ -316,7 +301,7 @@ xmlSAX2ExternalSubset(void *ctx, const xmlChar *name,
} }
if (xmlNewDtd(ctxt->myDoc, name, ExternalID, SystemID) == NULL) { if (xmlNewDtd(ctxt->myDoc, name, ExternalID, SystemID) == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
xmlFreeInputStream(input); xmlFreeInputStream(input);
return; return;
} }
@@ -336,7 +321,7 @@ xmlSAX2ExternalSubset(void *ctx, const xmlChar *name,
ctxt->inputTab = (xmlParserInputPtr *) ctxt->inputTab = (xmlParserInputPtr *)
xmlMalloc(5 * sizeof(xmlParserInputPtr)); xmlMalloc(5 * sizeof(xmlParserInputPtr));
if (ctxt->inputTab == NULL) { if (ctxt->inputTab == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2ExternalSubset"); xmlSAX2ErrMemory(ctxt);
xmlFreeInputStream(input); xmlFreeInputStream(input);
ctxt->input = oldinput; ctxt->input = oldinput;
ctxt->inputNr = oldinputNr; ctxt->inputNr = oldinputNr;
@@ -431,7 +416,7 @@ xmlSAX2ResolveEntity(void *ctx, const xmlChar *publicId, const xmlChar *systemId
base = ctxt->directory; base = ctxt->directory;
if (xmlBuildURISafe(systemId, (const xmlChar *) base, &URI) < 0) if (xmlBuildURISafe(systemId, (const xmlChar *) base, &URI) < 0)
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
ret = xmlLoadExternalEntity((const char *) URI, ret = xmlLoadExternalEntity((const char *) URI,
(const char *) publicId, ctxt); (const char *) publicId, ctxt);
@@ -538,7 +523,7 @@ xmlSAX2EntityDecl(void *ctx, const xmlChar *name, int type,
case XML_ERR_OK: case XML_ERR_OK:
break; break;
case XML_ERR_NO_MEMORY: case XML_ERR_NO_MEMORY:
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
return; return;
case XML_WAR_ENTITY_REDEFINED: case XML_WAR_ENTITY_REDEFINED:
if (ctxt->pedantic) { if (ctxt->pedantic) {
@@ -576,7 +561,7 @@ xmlSAX2EntityDecl(void *ctx, const xmlChar *name, int type,
if (base != NULL) { if (base != NULL) {
if (xmlBuildURISafe(systemId, (const xmlChar *) base, &URI) < 0) if (xmlBuildURISafe(systemId, (const xmlChar *) base, &URI) < 0)
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
else else
ent->URI = URI; ent->URI = URI;
} }
@@ -623,7 +608,7 @@ xmlSAX2AttributeDecl(void *ctx, const xmlChar *elem, const xmlChar *fullname,
/* TODO: optimize name/prefix allocation */ /* TODO: optimize name/prefix allocation */
name = xmlSplitQName(ctxt, fullname, &prefix); name = xmlSplitQName(ctxt, fullname, &prefix);
if (name == NULL) if (name == NULL)
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
ctxt->vctxt.valid = 1; ctxt->vctxt.valid = 1;
if (ctxt->inSubset == 1) if (ctxt->inSubset == 1)
attr = xmlAddAttributeDecl(&ctxt->vctxt, ctxt->myDoc->intSubset, elem, attr = xmlAddAttributeDecl(&ctxt->vctxt, ctxt->myDoc->intSubset, elem,
@@ -799,7 +784,7 @@ xmlSAX2StartDocument(void *ctx)
if (ctxt->myDoc == NULL) if (ctxt->myDoc == NULL)
ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL); ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL);
if (ctxt->myDoc == NULL) { if (ctxt->myDoc == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument"); xmlSAX2ErrMemory(ctxt);
return; return;
} }
ctxt->myDoc->properties = XML_DOC_HTML; ctxt->myDoc->properties = XML_DOC_HTML;
@@ -815,7 +800,7 @@ xmlSAX2StartDocument(void *ctx)
doc->parseFlags = ctxt->options; doc->parseFlags = ctxt->options;
doc->standalone = ctxt->standalone; doc->standalone = ctxt->standalone;
} else { } else {
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument"); xmlSAX2ErrMemory(ctxt);
return; return;
} }
if ((ctxt->dictNames) && (doc != NULL)) { if ((ctxt->dictNames) && (doc != NULL)) {
@@ -823,7 +808,7 @@ xmlSAX2StartDocument(void *ctx)
xmlDictReference(doc->dict); xmlDictReference(doc->dict);
} }
if (xmlTreeEnsureXMLDecl(doc) == NULL) { if (xmlTreeEnsureXMLDecl(doc) == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
return; return;
} }
} }
@@ -831,7 +816,7 @@ xmlSAX2StartDocument(void *ctx)
(ctxt->input != NULL) && (ctxt->input->filename != NULL)) { (ctxt->input != NULL) && (ctxt->input->filename != NULL)) {
ctxt->myDoc->URL = xmlPathToURI((const xmlChar *)ctxt->input->filename); ctxt->myDoc->URL = xmlPathToURI((const xmlChar *)ctxt->input->filename);
if (ctxt->myDoc->URL == NULL) if (ctxt->myDoc->URL == NULL)
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument"); xmlSAX2ErrMemory(ctxt);
} }
} }
@@ -871,7 +856,7 @@ xmlSAX2EndDocument(void *ctx)
if (encoding != NULL) { if (encoding != NULL) {
doc->encoding = xmlStrdup(encoding); doc->encoding = xmlStrdup(encoding);
if (doc->encoding == NULL) if (doc->encoding == NULL)
xmlSAX2ErrMemory(ctxt, "xmlSAX2EndDocument"); xmlSAX2ErrMemory(ctxt);
} }
} }
} }
@@ -945,7 +930,7 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
} }
} }
if (name == NULL) { if (name == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); xmlSAX2ErrMemory(ctxt);
if (ns != NULL) if (ns != NULL)
xmlFree(ns); xmlFree(ns);
return; return;
@@ -956,7 +941,7 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
(value == NULL) && (htmlIsBooleanAttr(fullname))) { (value == NULL) && (htmlIsBooleanAttr(fullname))) {
nval = xmlStrdup(fullname); nval = xmlStrdup(fullname);
if (nval == NULL) if (nval == NULL)
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
value = (const xmlChar *) nval; value = (const xmlChar *) nval;
} else } else
#endif #endif
@@ -999,7 +984,7 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
0,0,0); 0,0,0);
ctxt->depth--; ctxt->depth--;
if (val == NULL) { if (val == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); xmlSAX2ErrMemory(ctxt);
if (name != NULL) if (name != NULL)
xmlFree(name); xmlFree(name);
if (nval != NULL) if (nval != NULL)
@@ -1014,7 +999,7 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
xmlURIPtr uri; xmlURIPtr uri;
if (xmlParseURISafe((const char *)val, &uri) < 0) if (xmlParseURISafe((const char *)val, &uri) < 0)
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
if (uri == NULL) { if (uri == NULL) {
xmlNsWarnMsg(ctxt, XML_WAR_NS_URI, xmlNsWarnMsg(ctxt, XML_WAR_NS_URI,
"xmlns:%s: %s not a valid URI\n", name, value); "xmlns:%s: %s not a valid URI\n", name, value);
@@ -1031,7 +1016,7 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
/* a default namespace definition */ /* a default namespace definition */
nsret = xmlNewNs(ctxt->node, val, NULL); nsret = xmlNewNs(ctxt->node, val, NULL);
if (nsret == NULL) { if (nsret == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
} }
#ifdef LIBXML_VALID_ENABLED #ifdef LIBXML_VALID_ENABLED
/* /*
@@ -1067,7 +1052,7 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
0,0,0); 0,0,0);
ctxt->depth--; ctxt->depth--;
if (val == NULL) { if (val == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); xmlSAX2ErrMemory(ctxt);
xmlFree(ns); xmlFree(ns);
if (name != NULL) if (name != NULL)
xmlFree(name); xmlFree(name);
@@ -1087,7 +1072,7 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
xmlURIPtr uri; xmlURIPtr uri;
if (xmlParseURISafe((const char *)val, &uri) < 0) if (xmlParseURISafe((const char *)val, &uri) < 0)
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
if (uri == NULL) { if (uri == NULL) {
xmlNsWarnMsg(ctxt, XML_WAR_NS_URI, xmlNsWarnMsg(ctxt, XML_WAR_NS_URI,
"xmlns:%s: %s not a valid URI\n", name, value); "xmlns:%s: %s not a valid URI\n", name, value);
@@ -1105,7 +1090,7 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
xmlFree(ns); xmlFree(ns);
if (nsret == NULL) { if (nsret == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
} }
#ifdef LIBXML_VALID_ENABLED #ifdef LIBXML_VALID_ENABLED
/* /*
@@ -1163,7 +1148,7 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
/* !!!!!! <a toto:arg="" xmlns:toto="http://toto.com"> */ /* !!!!!! <a toto:arg="" xmlns:toto="http://toto.com"> */
ret = xmlNewNsPropEatName(ctxt->node, namespace, name, NULL); ret = xmlNewNsPropEatName(ctxt->node, namespace, name, NULL);
if (ret == NULL) { if (ret == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
goto error; goto error;
} }
@@ -1173,7 +1158,7 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
if ((value != NULL) && (value[0] != 0)) { if ((value != NULL) && (value[0] != 0)) {
ret->children = xmlStringGetNodeList(ctxt->myDoc, value); ret->children = xmlStringGetNodeList(ctxt->myDoc, value);
if (ret->children == NULL) if (ret->children == NULL)
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
} }
tmp = ret->children; tmp = ret->children;
while (tmp != NULL) { while (tmp != NULL) {
@@ -1185,7 +1170,7 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
} else if (value != NULL) { } else if (value != NULL) {
ret->children = xmlNewDocText(ctxt->myDoc, value); ret->children = xmlNewDocText(ctxt->myDoc, value);
if (ret->children == NULL) { if (ret->children == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
} else { } else {
ret->last = ret->children; ret->last = ret->children;
ret->children->parent = (xmlNodePtr) ret; ret->children->parent = (xmlNodePtr) ret;
@@ -1265,7 +1250,7 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
int res = xmlIsID(ctxt->myDoc, ctxt->node, ret); int res = xmlIsID(ctxt->myDoc, ctxt->node, ret);
if (res < 0) if (res < 0)
xmlErrMemory(ctxt, NULL); xmlCtxtErrMemory(ctxt);
else if (res > 0) else if (res > 0)
xmlAddID(&ctxt->vctxt, ctxt->myDoc, content, ret); xmlAddID(&ctxt->vctxt, ctxt->myDoc, content, ret);
else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret)) else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret))
@@ -1328,7 +1313,7 @@ process_external_subset:
fulln = xmlStrdup(attr->name); fulln = xmlStrdup(attr->name);
} }
if (fulln == NULL) { if (fulln == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); xmlSAX2ErrMemory(ctxt);
break; break;
} }
@@ -1394,7 +1379,7 @@ process_external_subset:
fulln = xmlBuildQName(attr->name, attr->prefix, fn, 50); fulln = xmlBuildQName(attr->name, attr->prefix, fn, 50);
if (fulln == NULL) { if (fulln == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); xmlSAX2ErrMemory(ctxt);
return; return;
} }
@@ -1479,7 +1464,7 @@ xmlSAX2StartElement(void *ctx, const xmlChar *fullname, const xmlChar **atts)
*/ */
name = xmlSplitQName(ctxt, fullname, &prefix); name = xmlSplitQName(ctxt, fullname, &prefix);
if (name == NULL) { if (name == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
return; return;
} }
} }
@@ -1492,7 +1477,7 @@ xmlSAX2StartElement(void *ctx, const xmlChar *fullname, const xmlChar **atts)
ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, name, NULL); ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, name, NULL);
if (ret == NULL) { if (ret == NULL) {
xmlFree(prefix); xmlFree(prefix);
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); xmlSAX2ErrMemory(ctxt);
return; return;
} }
ctxt->nodemem = -1; ctxt->nodemem = -1;
@@ -1566,7 +1551,7 @@ xmlSAX2StartElement(void *ctx, const xmlChar *fullname, const xmlChar **atts)
prefix, NULL); prefix, NULL);
ns = xmlNewNs(ret, NULL, prefix); ns = xmlNewNs(ret, NULL, prefix);
if (ns == NULL) if (ns == NULL)
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
} }
/* /*
@@ -1687,7 +1672,7 @@ xmlSAX2TextNode(xmlParserCtxtPtr ctxt, const xmlChar *str, int len) {
ret = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); ret = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
} }
if (ret == NULL) { if (ret == NULL) {
xmlErrMemory(ctxt, "xmlSAX2Characters"); xmlCtxtErrMemory(ctxt);
return(NULL); return(NULL);
} }
memset(ret, 0, sizeof(xmlNode)); memset(ret, 0, sizeof(xmlNode));
@@ -1709,7 +1694,7 @@ xmlSAX2TextNode(xmlParserCtxtPtr ctxt, const xmlChar *str, int len) {
((cur == '<') && (str[len + 1] != '!')))) { ((cur == '<') && (str[len + 1] != '!')))) {
intern = xmlDictLookup(ctxt->dict, str, len); intern = xmlDictLookup(ctxt->dict, str, len);
if (intern == NULL) { if (intern == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2TextNode"); xmlSAX2ErrMemory(ctxt);
xmlFree(ret); xmlFree(ret);
return(NULL); return(NULL);
} }
@@ -1722,7 +1707,7 @@ xmlSAX2TextNode(xmlParserCtxtPtr ctxt, const xmlChar *str, int len) {
} }
intern = xmlDictLookup(ctxt->dict, str, len); intern = xmlDictLookup(ctxt->dict, str, len);
if (intern == NULL) { if (intern == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2TextNode"); xmlSAX2ErrMemory(ctxt);
xmlFree(ret); xmlFree(ret);
return(NULL); return(NULL);
} }
@@ -1735,7 +1720,7 @@ skip:
if (intern == NULL) { if (intern == NULL) {
ret->content = xmlStrndup(str, len); ret->content = xmlStrndup(str, len);
if (ret->content == NULL) { if (ret->content == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2TextNode"); xmlSAX2ErrMemory(ctxt);
xmlFree(ret); xmlFree(ret);
return(NULL); return(NULL);
} }
@@ -1825,7 +1810,7 @@ xmlSAX2AttributeNs(xmlParserCtxtPtr ctxt,
} else { } else {
ret = xmlMalloc(sizeof(*ret)); ret = xmlMalloc(sizeof(*ret));
if (ret == NULL) { if (ret == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
return(NULL); return(NULL);
} }
} }
@@ -1851,7 +1836,7 @@ xmlSAX2AttributeNs(xmlParserCtxtPtr ctxt,
} else { } else {
ret->name = xmlStrdup(localname); ret->name = xmlStrdup(localname);
if (ret->name == NULL) if (ret->name == NULL)
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
} }
if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
@@ -1877,7 +1862,7 @@ xmlSAX2AttributeNs(xmlParserCtxtPtr ctxt,
ret->children = xmlStringLenGetNodeList(ctxt->myDoc, value, ret->children = xmlStringLenGetNodeList(ctxt->myDoc, value,
valueend - value); valueend - value);
if (ret->children == NULL) if (ret->children == NULL)
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
tmp = ret->children; tmp = ret->children;
while (tmp != NULL) { while (tmp != NULL) {
tmp->doc = ret->doc; tmp->doc = ret->doc;
@@ -1920,7 +1905,7 @@ xmlSAX2AttributeNs(xmlParserCtxtPtr ctxt,
*/ */
dup = xmlStrndup(value, valueend - value); dup = xmlStrndup(value, valueend - value);
if (dup == NULL) if (dup == NULL)
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt,
ctxt->myDoc, ctxt->node, ret, dup); ctxt->myDoc, ctxt->node, ret, dup);
@@ -1966,7 +1951,7 @@ xmlSAX2AttributeNs(xmlParserCtxtPtr ctxt,
*/ */
dup = xmlStrndup(value, valueend - value); dup = xmlStrndup(value, valueend - value);
if (dup == NULL) if (dup == NULL)
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt,
ctxt->myDoc, ctxt->node, ret, dup); ctxt->myDoc, ctxt->node, ret, dup);
@@ -2003,7 +1988,7 @@ xmlSAX2AttributeNs(xmlParserCtxtPtr ctxt,
int res = xmlIsID(ctxt->myDoc, ctxt->node, ret); int res = xmlIsID(ctxt->myDoc, ctxt->node, ret);
if (res < 0) if (res < 0)
xmlErrMemory(ctxt, NULL); xmlCtxtErrMemory(ctxt);
else if (res > 0) else if (res > 0)
xmlAddID(&ctxt->vctxt, ctxt->myDoc, content, ret); xmlAddID(&ctxt->vctxt, ctxt->myDoc, content, ret);
else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret)) else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret))
@@ -2076,14 +2061,14 @@ xmlSAX2StartElementNs(void *ctx,
fullname = xmlDictQLookup(ctxt->dict, prefix, localname); fullname = xmlDictQLookup(ctxt->dict, prefix, localname);
if (fullname == NULL) { if (fullname == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
return; return;
} }
localname = fullname; localname = fullname;
} else { } else {
lname = xmlBuildQName(localname, prefix, NULL, 0); lname = xmlBuildQName(localname, prefix, NULL, 0);
if (lname == NULL) { if (lname == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
return; return;
} }
} }
@@ -2107,7 +2092,7 @@ xmlSAX2StartElementNs(void *ctx,
else else
ret->name = lname; ret->name = lname;
if (ret->name == NULL) { if (ret->name == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); xmlSAX2ErrMemory(ctxt);
xmlFree(ret); xmlFree(ret);
return; return;
} }
@@ -2124,7 +2109,7 @@ xmlSAX2StartElementNs(void *ctx,
ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL,
(xmlChar *) lname, NULL); (xmlChar *) lname, NULL);
if (ret == NULL) { if (ret == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); xmlSAX2ErrMemory(ctxt);
return; return;
} }
} }
@@ -2154,7 +2139,7 @@ xmlSAX2StartElementNs(void *ctx,
if ((URI != NULL) && (prefix == pref)) if ((URI != NULL) && (prefix == pref))
ret->ns = ns; ret->ns = ns;
} else { } else {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
continue; continue;
} }
@@ -2209,7 +2194,7 @@ xmlSAX2StartElementNs(void *ctx,
ns = xmlNewNs(ret, NULL, prefix); ns = xmlNewNs(ret, NULL, prefix);
if (ns == NULL) { if (ns == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); xmlSAX2ErrMemory(ctxt);
return; return;
} }
if (prefix != NULL) if (prefix != NULL)
@@ -2242,7 +2227,7 @@ xmlSAX2StartElementNs(void *ctx,
fullname = xmlDictQLookup(ctxt->dict, attributes[j+1], fullname = xmlDictQLookup(ctxt->dict, attributes[j+1],
attributes[j]); attributes[j]);
if (fullname == NULL) { if (fullname == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
return; return;
} }
attr = xmlSAX2AttributeNs(ctxt, fullname, NULL, attr = xmlSAX2AttributeNs(ctxt, fullname, NULL,
@@ -2253,7 +2238,7 @@ xmlSAX2StartElementNs(void *ctx,
lname = xmlBuildQName(attributes[j], attributes[j+1], lname = xmlBuildQName(attributes[j], attributes[j+1],
NULL, 0); NULL, 0);
if (lname == NULL) { if (lname == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
return; return;
} }
attr = xmlSAX2AttributeNs(ctxt, lname, NULL, attr = xmlSAX2AttributeNs(ctxt, lname, NULL,
@@ -2351,7 +2336,7 @@ xmlSAX2Reference(void *ctx, const xmlChar *name)
if (ctx == NULL) return; if (ctx == NULL) return;
ret = xmlNewReference(ctxt->myDoc, name); ret = xmlNewReference(ctxt->myDoc, name);
if (ret == NULL) { if (ret == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
return; return;
} }
if (xmlAddChild(ctxt->node, ret) == NULL) { if (xmlAddChild(ctxt->node, ret) == NULL) {
@@ -2403,7 +2388,7 @@ xmlSAX2Text(xmlParserCtxtPtr ctxt, const xmlChar *ch, int len,
ctxt->nodelen = len; ctxt->nodelen = len;
ctxt->nodemem = len + 1; ctxt->nodemem = len + 1;
} else { } else {
xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters"); xmlSAX2ErrMemory(ctxt);
return; return;
} }
} else { } else {
@@ -2427,16 +2412,16 @@ xmlSAX2Text(xmlParserCtxtPtr ctxt, const xmlChar *ch, int len,
lastChild->content = xmlStrdup(lastChild->content); lastChild->content = xmlStrdup(lastChild->content);
} }
if (lastChild->content == NULL) { if (lastChild->content == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters: xmlStrdup returned NULL"); xmlSAX2ErrMemory(ctxt);
return; return;
} }
if (ctxt->nodelen > INT_MAX - len) { if (ctxt->nodelen > INT_MAX - len) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters overflow prevented"); xmlSAX2ErrMemory(ctxt);
return; return;
} }
if ((ctxt->nodelen + len > XML_MAX_TEXT_LENGTH) && if ((ctxt->nodelen + len > XML_MAX_TEXT_LENGTH) &&
((ctxt->options & XML_PARSE_HUGE) == 0)) { ((ctxt->options & XML_PARSE_HUGE) == 0)) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters: huge text node"); xmlSAX2ErrMemory(ctxt);
return; return;
} }
if (ctxt->nodelen + len >= ctxt->nodemem) { if (ctxt->nodelen + len >= ctxt->nodemem) {
@@ -2449,7 +2434,7 @@ xmlSAX2Text(xmlParserCtxtPtr ctxt, const xmlChar *ch, int len,
size = size > INT_MAX / 2 ? INT_MAX : size * 2; size = size > INT_MAX / 2 ? INT_MAX : size * 2;
newbuf = (xmlChar *) xmlRealloc(lastChild->content,size); newbuf = (xmlChar *) xmlRealloc(lastChild->content,size);
if (newbuf == NULL) { if (newbuf == NULL) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters"); xmlSAX2ErrMemory(ctxt);
return; return;
} }
ctxt->nodemem = size; ctxt->nodemem = size;
@@ -2460,7 +2445,7 @@ xmlSAX2Text(xmlParserCtxtPtr ctxt, const xmlChar *ch, int len,
lastChild->content[ctxt->nodelen] = 0; lastChild->content[ctxt->nodelen] = 0;
} else if (coalesceText) { } else if (coalesceText) {
if (xmlTextConcat(lastChild, ch, len)) { if (xmlTextConcat(lastChild, ch, len)) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters"); xmlSAX2ErrMemory(ctxt);
} }
if (ctxt->node->children != NULL) { if (ctxt->node->children != NULL) {
ctxt->nodelen = xmlStrlen(lastChild->content); ctxt->nodelen = xmlStrlen(lastChild->content);
@@ -2475,7 +2460,7 @@ xmlSAX2Text(xmlParserCtxtPtr ctxt, const xmlChar *ch, int len,
} else } else
lastChild = xmlNewCDataBlock(ctxt->myDoc, ch, len); lastChild = xmlNewCDataBlock(ctxt->myDoc, ch, len);
if (lastChild == NULL) { if (lastChild == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
} else { } else {
xmlAddChild(ctxt->node, lastChild); xmlAddChild(ctxt->node, lastChild);
if (ctxt->node->children != NULL) { if (ctxt->node->children != NULL) {
@@ -2549,7 +2534,7 @@ xmlSAX2ProcessingInstruction(void *ctx, const xmlChar *target,
ret = xmlNewDocPI(ctxt->myDoc, target, data); ret = xmlNewDocPI(ctxt->myDoc, target, data);
if (ret == NULL) { if (ret == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
return; return;
} }
@@ -2597,7 +2582,7 @@ xmlSAX2Comment(void *ctx, const xmlChar *value)
parent = ctxt->node; parent = ctxt->node;
ret = xmlNewDocComment(ctxt->myDoc, value); ret = xmlNewDocComment(ctxt->myDoc, value);
if (ret == NULL) { if (ret == NULL) {
xmlSAX2ErrMemory(ctxt, NULL); xmlSAX2ErrMemory(ctxt);
return; return;
} }
if (ctxt->linenumbers) { if (ctxt->linenumbers) {

View File

@@ -378,14 +378,14 @@ xmlFuzzEntityLoader(const char *URL, const char *ID ATTRIBUTE_UNUSED,
return(NULL); return(NULL);
input->filename = (char *) xmlCharStrdup(URL); input->filename = (char *) xmlCharStrdup(URL);
if (input->filename == NULL) { if (input->filename == NULL) {
xmlErrMemory(ctxt, NULL); xmlCtxtErrMemory(ctxt);
xmlFreeInputStream(input); xmlFreeInputStream(input);
return(NULL); return(NULL);
} }
input->buf = xmlParserInputBufferCreateMem(entity->data, entity->size, input->buf = xmlParserInputBufferCreateMem(entity->data, entity->size,
XML_CHAR_ENCODING_NONE); XML_CHAR_ENCODING_NONE);
if (input->buf == NULL) { if (input->buf == NULL) {
xmlErrMemory(ctxt, NULL); xmlCtxtErrMemory(ctxt);
xmlFreeInputStream(input); xmlFreeInputStream(input);
return(NULL); return(NULL);
} }

View File

@@ -272,8 +272,7 @@ const int oldXMLWDcompatibility = 0; /* DEPRECATED */
* while handling entities. * while handling entities.
* Disabled by default * Disabled by default
*/ */
int xmlParserDebugEntities = 0; const int xmlParserDebugEntities = 0;
static int xmlParserDebugEntitiesThrDef = 0;
/** /**
* xmlDoValidityCheckingDefaultValue: * xmlDoValidityCheckingDefaultValue:
* *
@@ -782,7 +781,6 @@ xmlInitGlobalState(xmlGlobalStatePtr gs) {
gs->gs_xmlKeepBlanksDefaultValue = xmlKeepBlanksDefaultValueThrDef; gs->gs_xmlKeepBlanksDefaultValue = xmlKeepBlanksDefaultValueThrDef;
gs->gs_xmlLineNumbersDefaultValue = xmlLineNumbersDefaultValueThrDef; gs->gs_xmlLineNumbersDefaultValue = xmlLineNumbersDefaultValueThrDef;
gs->gs_xmlLoadExtDtdDefaultValue = xmlLoadExtDtdDefaultValueThrDef; gs->gs_xmlLoadExtDtdDefaultValue = xmlLoadExtDtdDefaultValueThrDef;
gs->gs_xmlParserDebugEntities = xmlParserDebugEntitiesThrDef;
gs->gs_xmlPedanticParserDefaultValue = xmlPedanticParserDefaultValueThrDef; gs->gs_xmlPedanticParserDefaultValue = xmlPedanticParserDefaultValueThrDef;
gs->gs_xmlSubstituteEntitiesDefaultValue = gs->gs_xmlSubstituteEntitiesDefaultValue =
xmlSubstituteEntitiesDefaultValueThrDef; xmlSubstituteEntitiesDefaultValueThrDef;
@@ -907,6 +905,11 @@ __oldXMLWDcompatibility(void) {
return &oldXMLWDcompatibility; return &oldXMLWDcompatibility;
} }
const int *
__xmlParserDebugEntities(void) {
return &xmlParserDebugEntities;
}
const xmlSAXLocator * const xmlSAXLocator *
__xmlDefaultSAXLocator(void) { __xmlDefaultSAXLocator(void) {
return &xmlDefaultSAXLocator; return &xmlDefaultSAXLocator;
@@ -1124,13 +1127,8 @@ int xmlThrDefLoadExtDtdDefaultValue(int v) {
return ret; return ret;
} }
int xmlThrDefParserDebugEntities(int v) { int xmlThrDefParserDebugEntities(int v ATTRIBUTE_UNUSED) {
int ret; return(xmlParserDebugEntities);
xmlMutexLock(&xmlThrDefMutex);
ret = xmlParserDebugEntitiesThrDef;
xmlParserDebugEntitiesThrDef = v;
xmlMutexUnlock(&xmlThrDefMutex);
return ret;
} }
int xmlThrDefPedanticParserDefaultValue(int v) { int xmlThrDefPedanticParserDefaultValue(int v) {

View File

@@ -325,6 +325,9 @@ struct _xmlParserCtxt {
xmlParserNsData *nsdb; /* namespace database */ xmlParserNsData *nsdb; /* namespace database */
unsigned attrHashMax; /* allocated size */ unsigned attrHashMax; /* allocated size */
xmlAttrHashBucket *attrHash; /* atttribute hash table */ xmlAttrHashBucket *attrHash; /* atttribute hash table */
xmlStructuredErrorFunc errorHandler;
void *errorCtxt;
}; };
/** /**
@@ -844,6 +847,8 @@ XMLPUBVAR const char *const xmlParserVersion;
XML_DEPRECATED XML_DEPRECATED
XMLPUBVAR const int oldXMLWDcompatibility; XMLPUBVAR const int oldXMLWDcompatibility;
XML_DEPRECATED XML_DEPRECATED
XMLPUBVAR const int xmlParserDebugEntities;
XML_DEPRECATED
XMLPUBVAR const xmlSAXLocator xmlDefaultSAXLocator; XMLPUBVAR const xmlSAXLocator xmlDefaultSAXLocator;
#ifdef LIBXML_SAX1_ENABLED #ifdef LIBXML_SAX1_ENABLED
XML_DEPRECATED XML_DEPRECATED
@@ -856,6 +861,8 @@ XMLPUBFUN const char *const *__xmlParserVersion(void);
XML_DEPRECATED XML_DEPRECATED
XMLPUBFUN const int *__oldXMLWDcompatibility(void); XMLPUBFUN const int *__oldXMLWDcompatibility(void);
XML_DEPRECATED XML_DEPRECATED
XMLPUBFUN const int *__xmlParserDebugEntities(void);
XML_DEPRECATED
XMLPUBFUN const xmlSAXLocator *__xmlDefaultSAXLocator(void); XMLPUBFUN const xmlSAXLocator *__xmlDefaultSAXLocator(void);
#ifdef LIBXML_SAX1_ENABLED #ifdef LIBXML_SAX1_ENABLED
XML_DEPRECATED XML_DEPRECATED
@@ -870,7 +877,6 @@ XMLPUBFUN const xmlSAXHandlerV1 *__xmlDefaultSAXHandler(void);
XML_OP(xmlKeepBlanksDefaultValue, int, XML_DEPRECATED) \ XML_OP(xmlKeepBlanksDefaultValue, int, XML_DEPRECATED) \
XML_OP(xmlLineNumbersDefaultValue, int, XML_DEPRECATED) \ XML_OP(xmlLineNumbersDefaultValue, int, XML_DEPRECATED) \
XML_OP(xmlLoadExtDtdDefaultValue, int, XML_DEPRECATED) \ XML_OP(xmlLoadExtDtdDefaultValue, int, XML_DEPRECATED) \
XML_OP(xmlParserDebugEntities, int, XML_DEPRECATED) \
XML_OP(xmlPedanticParserDefaultValue, int, XML_DEPRECATED) \ XML_OP(xmlPedanticParserDefaultValue, int, XML_DEPRECATED) \
XML_OP(xmlSubstituteEntitiesDefaultValue, int, XML_DEPRECATED) XML_OP(xmlSubstituteEntitiesDefaultValue, int, XML_DEPRECATED)
@@ -903,7 +909,6 @@ XML_GLOBALS_PARSER
#define xmlLineNumbersDefaultValue \ #define xmlLineNumbersDefaultValue \
XML_GLOBAL_MACRO(xmlLineNumbersDefaultValue) XML_GLOBAL_MACRO(xmlLineNumbersDefaultValue)
#define xmlLoadExtDtdDefaultValue XML_GLOBAL_MACRO(xmlLoadExtDtdDefaultValue) #define xmlLoadExtDtdDefaultValue XML_GLOBAL_MACRO(xmlLoadExtDtdDefaultValue)
#define xmlParserDebugEntities XML_GLOBAL_MACRO(xmlParserDebugEntities)
#define xmlPedanticParserDefaultValue \ #define xmlPedanticParserDefaultValue \
XML_GLOBAL_MACRO(xmlPedanticParserDefaultValue) XML_GLOBAL_MACRO(xmlPedanticParserDefaultValue)
#define xmlSubstituteEntitiesDefaultValue \ #define xmlSubstituteEntitiesDefaultValue \
@@ -1270,6 +1275,10 @@ XMLPUBFUN int
XMLPUBFUN int XMLPUBFUN int
xmlCtxtUseOptions (xmlParserCtxtPtr ctxt, xmlCtxtUseOptions (xmlParserCtxtPtr ctxt,
int options); int options);
XMLPUBFUN void
xmlCtxtSetErrorHandler (xmlParserCtxtPtr ctxt,
xmlStructuredErrorFunc handler,
void *data);
XMLPUBFUN void XMLPUBFUN void
xmlCtxtSetMaxAmplification(xmlParserCtxtPtr ctxt, xmlCtxtSetMaxAmplification(xmlParserCtxtPtr ctxt,
unsigned maxAmpl); unsigned maxAmpl);

View File

@@ -314,8 +314,7 @@ XMLPUBFUN xmlParserCtxtPtr
const xmlChar *ID, const xmlChar *ID,
const xmlChar *base); const xmlChar *base);
XMLPUBFUN void XMLPUBFUN void
xmlErrMemory (xmlParserCtxtPtr ctxt, xmlCtxtErrMemory (xmlParserCtxtPtr ctxt);
const char *extra);
XMLPUBFUN int XMLPUBFUN int
xmlSwitchEncoding (xmlParserCtxtPtr ctxt, xmlSwitchEncoding (xmlParserCtxtPtr ctxt,
xmlCharEncoding enc); xmlCharEncoding enc);

View File

@@ -28,6 +28,8 @@
#define PARSER_STOPPED(ctxt) ((ctxt)->disableSAX > 1) #define PARSER_STOPPED(ctxt) ((ctxt)->disableSAX > 1)
XML_HIDDEN void
xmlErrMemory(xmlParserCtxtPtr ctxt);
XML_HIDDEN void XML_HIDDEN void
xmlVErrParser(xmlParserCtxtPtr ctxt, xmlNodePtr node, xmlVErrParser(xmlParserCtxtPtr ctxt, xmlNodePtr node,
int domain, int code, xmlErrorLevel level, int domain, int code, xmlErrorLevel level,

247
parser.c
View File

@@ -229,6 +229,11 @@ xmlLoadEntityContent(xmlParserCtxtPtr ctxt, xmlEntityPtr entity);
* * * *
************************************************************************/ ************************************************************************/
void
xmlErrMemory(xmlParserCtxtPtr ctxt) {
xmlCtxtErrMemory(ctxt);
}
/** /**
* xmlErrAttributeDup: * xmlErrAttributeDup:
* @ctxt: an XML parser context * @ctxt: an XML parser context
@@ -761,7 +766,7 @@ xmlDetectSAX2(xmlParserCtxtPtr ctxt) {
ctxt->str_xml_ns = xmlDictLookup(ctxt->dict, XML_XML_NAMESPACE, 36); ctxt->str_xml_ns = xmlDictLookup(ctxt->dict, XML_XML_NAMESPACE, 36);
if ((ctxt->str_xml==NULL) || (ctxt->str_xmlns==NULL) || if ((ctxt->str_xml==NULL) || (ctxt->str_xmlns==NULL) ||
(ctxt->str_xml_ns == NULL)) { (ctxt->str_xml_ns == NULL)) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
} }
} }
@@ -871,7 +876,7 @@ xmlAttrNormalizeSpace2(xmlParserCtxtPtr ctxt, xmlChar *src, int *len)
ret = xmlStrndup(src + remove_head, i - remove_head + 1); ret = xmlStrndup(src + remove_head, i - remove_head + 1);
if (ret == NULL) { if (ret == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
xmlAttrNormalizeSpace(ret, ret); xmlAttrNormalizeSpace(ret, ret);
@@ -1002,7 +1007,7 @@ xmlAddDefAttrs(xmlParserCtxtPtr ctxt,
return; return;
mem_error: mem_error:
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return; return;
} }
@@ -1033,7 +1038,7 @@ xmlAddSpecialAttr(xmlParserCtxtPtr ctxt,
return; return;
mem_error: mem_error:
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return; return;
} }
@@ -1527,7 +1532,7 @@ xmlParserNsGrow(xmlParserCtxtPtr ctxt) {
return(0); return(0);
error: error:
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(-1); return(-1);
} }
@@ -1556,7 +1561,7 @@ xmlParserNsPush(xmlParserCtxtPtr ctxt, const xmlHashedString *prefix,
return(0); return(0);
if ((ctxt->nsNr >= ctxt->nsMax) && (xmlParserNsGrow(ctxt) < 0)) { if ((ctxt->nsNr >= ctxt->nsMax) && (xmlParserNsGrow(ctxt) < 0)) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(-1); return(-1);
} }
@@ -1622,13 +1627,13 @@ xmlParserNsPush(xmlParserCtxtPtr ctxt, const xmlHashedString *prefix,
unsigned newSize, i, index; unsigned newSize, i, index;
if (ctxt->nsdb->hashSize > UINT_MAX / 2) { if (ctxt->nsdb->hashSize > UINT_MAX / 2) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(-1); return(-1);
} }
newSize = ctxt->nsdb->hashSize ? ctxt->nsdb->hashSize * 2 : 16; newSize = ctxt->nsdb->hashSize ? ctxt->nsdb->hashSize * 2 : 16;
newHash = xmlMalloc(newSize * sizeof(newHash[0])); newHash = xmlMalloc(newSize * sizeof(newHash[0]));
if (newHash == NULL) { if (newHash == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(-1); return(-1);
} }
memset(newHash, 0, newSize * sizeof(newHash[0])); memset(newHash, 0, newSize * sizeof(newHash[0]));
@@ -1756,7 +1761,7 @@ xmlCtxtGrowAttrs(xmlParserCtxtPtr ctxt, int nr) {
} }
return(ctxt->maxatts); return(ctxt->maxatts);
mem_error: mem_error:
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(-1); return(-1);
} }
@@ -1781,7 +1786,7 @@ inputPush(xmlParserCtxtPtr ctxt, xmlParserInputPtr value)
tmp = (xmlParserInputPtr *) xmlRealloc(ctxt->inputTab, tmp = (xmlParserInputPtr *) xmlRealloc(ctxt->inputTab,
newSize * sizeof(*tmp)); newSize * sizeof(*tmp));
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return (-1); return (-1);
} }
ctxt->inputTab = tmp; ctxt->inputTab = tmp;
@@ -1839,7 +1844,7 @@ nodePush(xmlParserCtxtPtr ctxt, xmlNodePtr value)
ctxt->nodeMax * 2 * ctxt->nodeMax * 2 *
sizeof(ctxt->nodeTab[0])); sizeof(ctxt->nodeTab[0]));
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return (-1); return (-1);
} }
ctxt->nodeTab = tmp; ctxt->nodeTab = tmp;
@@ -1940,7 +1945,7 @@ nameNsPush(xmlParserCtxtPtr ctxt, const xmlChar * value,
tag->nsNr = nsNr; tag->nsNr = nsNr;
return (ctxt->nameNr++); return (ctxt->nameNr++);
mem_error: mem_error:
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return (-1); return (-1);
} }
#ifdef LIBXML_PUSH_ENABLED #ifdef LIBXML_PUSH_ENABLED
@@ -2001,7 +2006,7 @@ namePush(xmlParserCtxtPtr ctxt, const xmlChar * value)
ctxt->name = value; ctxt->name = value;
return (ctxt->nameNr++); return (ctxt->nameNr++);
mem_error: mem_error:
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return (-1); return (-1);
} }
@@ -2040,7 +2045,7 @@ static int spacePush(xmlParserCtxtPtr ctxt, int val) {
tmp = (int *) xmlRealloc(ctxt->spaceTab, tmp = (int *) xmlRealloc(ctxt->spaceTab,
ctxt->spaceMax * sizeof(ctxt->spaceTab[0])); ctxt->spaceMax * sizeof(ctxt->spaceTab[0]));
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
ctxt->spaceMax /=2; ctxt->spaceMax /=2;
return(-1); return(-1);
} }
@@ -2296,9 +2301,6 @@ xmlPopInput(xmlParserCtxtPtr ctxt) {
xmlParserInputPtr input; xmlParserInputPtr input;
if ((ctxt == NULL) || (ctxt->inputNr <= 1)) return(0); if ((ctxt == NULL) || (ctxt->inputNr <= 1)) return(0);
if (xmlParserDebugEntities)
xmlGenericError(xmlGenericErrorContext,
"Popping input %d\n", ctxt->inputNr);
input = inputPop(ctxt); input = inputPop(ctxt);
if (input->entity != NULL) if (input->entity != NULL)
input->entity->flags &= ~XML_ENT_EXPANDING; input->entity->flags &= ~XML_ENT_EXPANDING;
@@ -2322,14 +2324,6 @@ xmlPushInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr input) {
int ret; int ret;
if (input == NULL) return(-1); if (input == NULL) return(-1);
if (xmlParserDebugEntities) {
if ((ctxt->input != NULL) && (ctxt->input->filename))
xmlGenericError(xmlGenericErrorContext,
"%s(%d): ", ctxt->input->filename,
ctxt->input->line);
xmlGenericError(xmlGenericErrorContext,
"Pushing input %d : %.30s\n", ctxt->inputNr+1, input->cur);
}
if (((ctxt->inputNr > 40) && ((ctxt->options & XML_PARSE_HUGE) == 0)) || if (((ctxt->inputNr > 40) && ((ctxt->options & XML_PARSE_HUGE) == 0)) ||
(ctxt->inputNr > 100)) { (ctxt->inputNr > 100)) {
xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL);
@@ -2718,10 +2712,6 @@ xmlStringDecodeEntitiesInt(xmlParserCtxtPtr ctxt, const xmlChar *str, int len,
growBuffer(buffer, XML_PARSER_BUFFER_SIZE); growBuffer(buffer, XML_PARSER_BUFFER_SIZE);
} }
} else if ((c == '&') && (what & XML_SUBSTITUTE_REF)) { } else if ((c == '&') && (what & XML_SUBSTITUTE_REF)) {
if (xmlParserDebugEntities)
xmlGenericError(xmlGenericErrorContext,
"String decoding Entity Reference: %.30s\n",
str);
ent = xmlParseStringEntityRef(ctxt, &str); ent = xmlParseStringEntityRef(ctxt, &str);
if ((ent != NULL) && if ((ent != NULL) &&
(ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) {
@@ -2780,9 +2770,6 @@ xmlStringDecodeEntitiesInt(xmlParserCtxtPtr ctxt, const xmlChar *str, int len,
buffer[nbchars++] = ';'; buffer[nbchars++] = ';';
} }
} else if (c == '%' && (what & XML_SUBSTITUTE_PEREF)) { } else if (c == '%' && (what & XML_SUBSTITUTE_PEREF)) {
if (xmlParserDebugEntities)
xmlGenericError(xmlGenericErrorContext,
"String decoding PE Reference: %.30s\n", str);
ent = xmlParseStringPEReference(ctxt, &str); ent = xmlParseStringPEReference(ctxt, &str);
if (ent != NULL) { if (ent != NULL) {
if (ent->content == NULL) { if (ent->content == NULL) {
@@ -2852,7 +2839,7 @@ xmlStringDecodeEntitiesInt(xmlParserCtxtPtr ctxt, const xmlChar *str, int len,
return(buffer); return(buffer);
mem_error: mem_error:
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
int_error: int_error:
if (rep != NULL) if (rep != NULL)
xmlFree(rep); xmlFree(rep);
@@ -3076,7 +3063,7 @@ xmlSplitQName(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefixOut) {
buffer = (xmlChar *) xmlMallocAtomic(max); buffer = (xmlChar *) xmlMallocAtomic(max);
if (buffer == NULL) { if (buffer == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
memcpy(buffer, buf, len); memcpy(buffer, buf, len);
@@ -3088,7 +3075,7 @@ xmlSplitQName(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefixOut) {
tmp = (xmlChar *) xmlRealloc(buffer, max); tmp = (xmlChar *) xmlRealloc(buffer, max);
if (tmp == NULL) { if (tmp == NULL) {
xmlFree(buffer); xmlFree(buffer);
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
buffer = tmp; buffer = tmp;
@@ -3108,7 +3095,7 @@ xmlSplitQName(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefixOut) {
if (buffer == NULL) { if (buffer == NULL) {
ret = xmlStrndup(buf, len); ret = xmlStrndup(buf, len);
if (ret == NULL) { if (ret == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
} else { } else {
@@ -3163,7 +3150,7 @@ xmlSplitQName(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefixOut) {
buffer = (xmlChar *) xmlMallocAtomic(max); buffer = (xmlChar *) xmlMallocAtomic(max);
if (buffer == NULL) { if (buffer == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
xmlFree(prefix); xmlFree(prefix);
return(NULL); return(NULL);
} }
@@ -3175,7 +3162,7 @@ xmlSplitQName(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefixOut) {
max *= 2; max *= 2;
tmp = (xmlChar *) xmlRealloc(buffer, max); tmp = (xmlChar *) xmlRealloc(buffer, max);
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
xmlFree(prefix); xmlFree(prefix);
xmlFree(buffer); xmlFree(buffer);
return(NULL); return(NULL);
@@ -3406,7 +3393,7 @@ xmlParseNameComplex(xmlParserCtxtPtr ctxt) {
else else
ret = xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len); ret = xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len);
if (ret == NULL) if (ret == NULL)
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(ret); return(ret);
} }
@@ -3463,7 +3450,7 @@ xmlParseName(xmlParserCtxtPtr ctxt) {
ctxt->input->cur = in; ctxt->input->cur = in;
ctxt->input->col += count; ctxt->input->col += count;
if (ret == NULL) if (ret == NULL)
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(ret); return(ret);
} }
} }
@@ -3507,7 +3494,7 @@ xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) {
} }
ret = xmlDictLookupHashed(ctxt->dict, (BASE_PTR + startPosition), len); ret = xmlDictLookupHashed(ctxt->dict, (BASE_PTR + startPosition), len);
if (ret.name == NULL) if (ret.name == NULL)
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(ret); return(ret);
} }
@@ -3564,7 +3551,7 @@ xmlParseNCName(xmlParserCtxtPtr ctxt) {
ctxt->input->cur = in; ctxt->input->cur = in;
ctxt->input->col += count; ctxt->input->col += count;
if (ret.name == NULL) { if (ret.name == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
} }
return(ret); return(ret);
} }
@@ -3663,7 +3650,7 @@ xmlParseStringName(xmlParserCtxtPtr ctxt, const xmlChar** str) {
buffer = (xmlChar *) xmlMallocAtomic(max); buffer = (xmlChar *) xmlMallocAtomic(max);
if (buffer == NULL) { if (buffer == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
memcpy(buffer, buf, len); memcpy(buffer, buf, len);
@@ -3674,7 +3661,7 @@ xmlParseStringName(xmlParserCtxtPtr ctxt, const xmlChar** str) {
max *= 2; max *= 2;
tmp = (xmlChar *) xmlRealloc(buffer, max); tmp = (xmlChar *) xmlRealloc(buffer, max);
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
xmlFree(buffer); xmlFree(buffer);
return(NULL); return(NULL);
} }
@@ -3701,7 +3688,7 @@ xmlParseStringName(xmlParserCtxtPtr ctxt, const xmlChar** str) {
*str = cur; *str = cur;
ret = xmlStrndup(buf, len); ret = xmlStrndup(buf, len);
if (ret == NULL) if (ret == NULL)
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(ret); return(ret);
} }
@@ -3746,7 +3733,7 @@ xmlParseNmtoken(xmlParserCtxtPtr ctxt) {
buffer = (xmlChar *) xmlMallocAtomic(max); buffer = (xmlChar *) xmlMallocAtomic(max);
if (buffer == NULL) { if (buffer == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
memcpy(buffer, buf, len); memcpy(buffer, buf, len);
@@ -3757,7 +3744,7 @@ xmlParseNmtoken(xmlParserCtxtPtr ctxt) {
max *= 2; max *= 2;
tmp = (xmlChar *) xmlRealloc(buffer, max); tmp = (xmlChar *) xmlRealloc(buffer, max);
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
xmlFree(buffer); xmlFree(buffer);
return(NULL); return(NULL);
} }
@@ -3784,7 +3771,7 @@ xmlParseNmtoken(xmlParserCtxtPtr ctxt) {
} }
ret = xmlStrndup(buf, len); ret = xmlStrndup(buf, len);
if (ret == NULL) if (ret == NULL)
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(ret); return(ret);
} }
@@ -3825,7 +3812,7 @@ xmlParseEntityValue(xmlParserCtxtPtr ctxt, xmlChar **orig) {
} }
buf = (xmlChar *) xmlMallocAtomic(size); buf = (xmlChar *) xmlMallocAtomic(size);
if (buf == NULL) { if (buf == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
@@ -3855,7 +3842,7 @@ xmlParseEntityValue(xmlParserCtxtPtr ctxt, xmlChar **orig) {
size *= 2; size *= 2;
tmp = (xmlChar *) xmlRealloc(buf, size); tmp = (xmlChar *) xmlRealloc(buf, size);
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto error; goto error;
} }
buf = tmp; buf = tmp;
@@ -4188,7 +4175,7 @@ xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) {
return(buf); return(buf);
mem_error: mem_error:
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
error: error:
if (buf != NULL) if (buf != NULL)
xmlFree(buf); xmlFree(buf);
@@ -4277,7 +4264,7 @@ xmlParseSystemLiteral(xmlParserCtxtPtr ctxt) {
buf = (xmlChar *) xmlMallocAtomic(size); buf = (xmlChar *) xmlMallocAtomic(size);
if (buf == NULL) { if (buf == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
ctxt->instate = XML_PARSER_SYSTEM_LITERAL; ctxt->instate = XML_PARSER_SYSTEM_LITERAL;
@@ -4290,7 +4277,7 @@ xmlParseSystemLiteral(xmlParserCtxtPtr ctxt) {
tmp = (xmlChar *) xmlRealloc(buf, size); tmp = (xmlChar *) xmlRealloc(buf, size);
if (tmp == NULL) { if (tmp == NULL) {
xmlFree(buf); xmlFree(buf);
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
buf = tmp; buf = tmp;
@@ -4352,7 +4339,7 @@ xmlParsePubidLiteral(xmlParserCtxtPtr ctxt) {
} }
buf = (xmlChar *) xmlMallocAtomic(size); buf = (xmlChar *) xmlMallocAtomic(size);
if (buf == NULL) { if (buf == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
ctxt->instate = XML_PARSER_PUBLIC_LITERAL; ctxt->instate = XML_PARSER_PUBLIC_LITERAL;
@@ -4365,7 +4352,7 @@ xmlParsePubidLiteral(xmlParserCtxtPtr ctxt) {
size *= 2; size *= 2;
tmp = (xmlChar *) xmlRealloc(buf, size); tmp = (xmlChar *) xmlRealloc(buf, size);
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
xmlFree(buf); xmlFree(buf);
return(NULL); return(NULL);
} }
@@ -4798,7 +4785,7 @@ xmlParseCommentComplex(xmlParserCtxtPtr ctxt, xmlChar *buf,
size = XML_PARSER_BUFFER_SIZE; size = XML_PARSER_BUFFER_SIZE;
buf = (xmlChar *) xmlMallocAtomic(size); buf = (xmlChar *) xmlMallocAtomic(size);
if (buf == NULL) { if (buf == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return; return;
} }
} }
@@ -4841,7 +4828,7 @@ xmlParseCommentComplex(xmlParserCtxtPtr ctxt, xmlChar *buf,
new_buf = (xmlChar *) xmlRealloc(buf, new_size); new_buf = (xmlChar *) xmlRealloc(buf, new_size);
if (new_buf == NULL) { if (new_buf == NULL) {
xmlFree (buf); xmlFree (buf);
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return; return;
} }
buf = new_buf; buf = new_buf;
@@ -4973,7 +4960,7 @@ get_more:
size = XML_PARSER_BUFFER_SIZE + nbchar; size = XML_PARSER_BUFFER_SIZE + nbchar;
buf = (xmlChar *) xmlMallocAtomic(size); buf = (xmlChar *) xmlMallocAtomic(size);
if (buf == NULL) { if (buf == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return; return;
} }
len = 0; len = 0;
@@ -4983,7 +4970,7 @@ get_more:
new_buf = (xmlChar *) xmlRealloc(buf, size); new_buf = (xmlChar *) xmlRealloc(buf, size);
if (new_buf == NULL) { if (new_buf == NULL) {
xmlFree (buf); xmlFree (buf);
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return; return;
} }
buf = new_buf; buf = new_buf;
@@ -5229,7 +5216,7 @@ xmlParsePI(xmlParserCtxtPtr ctxt) {
} }
buf = (xmlChar *) xmlMallocAtomic(size); buf = (xmlChar *) xmlMallocAtomic(size);
if (buf == NULL) { if (buf == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return; return;
} }
if (SKIP_BLANKS == 0) { if (SKIP_BLANKS == 0) {
@@ -5244,7 +5231,7 @@ xmlParsePI(xmlParserCtxtPtr ctxt) {
size_t new_size = size * 2; size_t new_size = size * 2;
tmp = (xmlChar *) xmlRealloc(buf, new_size); tmp = (xmlChar *) xmlRealloc(buf, new_size);
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
xmlFree(buf); xmlFree(buf);
return; return;
} }
@@ -5473,7 +5460,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
xmlURIPtr uri; xmlURIPtr uri;
if (xmlParseURISafe((const char *) URI, &uri) < 0) { if (xmlParseURISafe((const char *) URI, &uri) < 0) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
} else if (uri == NULL) { } else if (uri == NULL) {
/* /*
* This really ought to be a well formedness error * This really ought to be a well formedness error
@@ -5515,7 +5502,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
if (ctxt->myDoc == NULL) { if (ctxt->myDoc == NULL) {
ctxt->myDoc = xmlNewDoc(SAX_COMPAT_MODE); ctxt->myDoc = xmlNewDoc(SAX_COMPAT_MODE);
if (ctxt->myDoc == NULL) { if (ctxt->myDoc == NULL) {
xmlErrMemory(ctxt, "New Doc failed"); xmlErrMemory(ctxt);
goto done; goto done;
} }
ctxt->myDoc->properties = XML_DOC_INTERNAL; ctxt->myDoc->properties = XML_DOC_INTERNAL;
@@ -5524,7 +5511,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
ctxt->myDoc->intSubset = xmlNewDtd(ctxt->myDoc, ctxt->myDoc->intSubset = xmlNewDtd(ctxt->myDoc,
BAD_CAST "fake", NULL, NULL); BAD_CAST "fake", NULL, NULL);
if (ctxt->myDoc->intSubset == NULL) { if (ctxt->myDoc->intSubset == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto done; goto done;
} }
} }
@@ -5541,7 +5528,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
xmlURIPtr uri; xmlURIPtr uri;
if (xmlParseURISafe((const char *) URI, &uri) < 0) { if (xmlParseURISafe((const char *) URI, &uri) < 0) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
} else if (uri == NULL) { } else if (uri == NULL) {
/* /*
* This really ought to be a well formedness error * This really ought to be a well formedness error
@@ -5590,7 +5577,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
if (ctxt->myDoc == NULL) { if (ctxt->myDoc == NULL) {
ctxt->myDoc = xmlNewDoc(SAX_COMPAT_MODE); ctxt->myDoc = xmlNewDoc(SAX_COMPAT_MODE);
if (ctxt->myDoc == NULL) { if (ctxt->myDoc == NULL) {
xmlErrMemory(ctxt, "New Doc failed"); xmlErrMemory(ctxt);
goto done; goto done;
} }
ctxt->myDoc->properties = XML_DOC_INTERNAL; ctxt->myDoc->properties = XML_DOC_INTERNAL;
@@ -5600,7 +5587,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
ctxt->myDoc->intSubset = xmlNewDtd(ctxt->myDoc, ctxt->myDoc->intSubset = xmlNewDtd(ctxt->myDoc,
BAD_CAST "fake", NULL, NULL); BAD_CAST "fake", NULL, NULL);
if (ctxt->myDoc->intSubset == NULL) { if (ctxt->myDoc->intSubset == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto done; goto done;
} }
} }
@@ -5773,7 +5760,7 @@ xmlParseNotationType(xmlParserCtxtPtr ctxt) {
if (tmp == NULL) { if (tmp == NULL) {
cur = xmlCreateEnumeration(name); cur = xmlCreateEnumeration(name);
if (cur == NULL) { if (cur == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
xmlFreeEnumeration(ret); xmlFreeEnumeration(ret);
return(NULL); return(NULL);
} }
@@ -5845,7 +5832,7 @@ xmlParseEnumerationType(xmlParserCtxtPtr ctxt) {
if (!xmlDictOwns(ctxt->dict, name)) if (!xmlDictOwns(ctxt->dict, name))
xmlFree(name); xmlFree(name);
if (cur == NULL) { if (cur == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
xmlFreeEnumeration(ret); xmlFreeEnumeration(ret);
return(NULL); return(NULL);
} }
@@ -6212,7 +6199,7 @@ xmlParseElementMixedContentDecl(xmlParserCtxtPtr ctxt, int inputchk) {
return(ret); return(ret);
mem_error: mem_error:
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
xmlFreeDocElementContent(ctxt->myDoc, ret); xmlFreeDocElementContent(ctxt->myDoc, ret);
return(NULL); return(NULL);
} }
@@ -6285,7 +6272,7 @@ xmlParseElementChildrenContentDeclPriv(xmlParserCtxtPtr ctxt, int inputchk,
} }
cur = ret = xmlNewDocElementContent(ctxt->myDoc, elem, XML_ELEMENT_CONTENT_ELEMENT); cur = ret = xmlNewDocElementContent(ctxt->myDoc, elem, XML_ELEMENT_CONTENT_ELEMENT);
if (cur == NULL) { if (cur == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
GROW; GROW;
@@ -6328,7 +6315,7 @@ xmlParseElementChildrenContentDeclPriv(xmlParserCtxtPtr ctxt, int inputchk,
op = xmlNewDocElementContent(ctxt->myDoc, NULL, XML_ELEMENT_CONTENT_SEQ); op = xmlNewDocElementContent(ctxt->myDoc, NULL, XML_ELEMENT_CONTENT_SEQ);
if (op == NULL) { if (op == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
if ((last != NULL) && (last != ret)) if ((last != NULL) && (last != ret))
xmlFreeDocElementContent(ctxt->myDoc, last); xmlFreeDocElementContent(ctxt->myDoc, last);
xmlFreeDocElementContent(ctxt->myDoc, ret); xmlFreeDocElementContent(ctxt->myDoc, ret);
@@ -6369,7 +6356,7 @@ xmlParseElementChildrenContentDeclPriv(xmlParserCtxtPtr ctxt, int inputchk,
op = xmlNewDocElementContent(ctxt->myDoc, NULL, XML_ELEMENT_CONTENT_OR); op = xmlNewDocElementContent(ctxt->myDoc, NULL, XML_ELEMENT_CONTENT_OR);
if (op == NULL) { if (op == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
if ((last != NULL) && (last != ret)) if ((last != NULL) && (last != ret))
xmlFreeDocElementContent(ctxt->myDoc, last); xmlFreeDocElementContent(ctxt->myDoc, last);
if (ret != NULL) if (ret != NULL)
@@ -6425,7 +6412,7 @@ xmlParseElementChildrenContentDeclPriv(xmlParserCtxtPtr ctxt, int inputchk,
} }
last = xmlNewDocElementContent(ctxt->myDoc, elem, XML_ELEMENT_CONTENT_ELEMENT); last = xmlNewDocElementContent(ctxt->myDoc, elem, XML_ELEMENT_CONTENT_ELEMENT);
if (last == NULL) { if (last == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
if (ret != NULL) if (ret != NULL)
xmlFreeDocElementContent(ctxt->myDoc, ret); xmlFreeDocElementContent(ctxt->myDoc, ret);
return(NULL); return(NULL);
@@ -6769,7 +6756,7 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) {
tmp = (int *) xmlRealloc(inputIds, tmp = (int *) xmlRealloc(inputIds,
inputIdsSize * sizeof(int)); inputIdsSize * sizeof(int));
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto error; goto error;
} }
inputIds = tmp; inputIds = tmp;
@@ -6803,7 +6790,7 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) {
ignoreDepth++; ignoreDepth++;
/* Check for integer overflow */ /* Check for integer overflow */
if (ignoreDepth == 0) { if (ignoreDepth == 0) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto error; goto error;
} }
} else if ((RAW == ']') && (NXT(1) == ']') && } else if ((RAW == ']') && (NXT(1) == ']') &&
@@ -6958,7 +6945,7 @@ xmlParseTextDecl(xmlParserCtxtPtr ctxt) {
if (version == NULL) { if (version == NULL) {
version = xmlCharStrdup(XML_DEFAULT_VERSION); version = xmlCharStrdup(XML_DEFAULT_VERSION);
if (version == NULL) { if (version == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return; return;
} }
} else { } else {
@@ -7034,14 +7021,14 @@ xmlParseExternalSubset(xmlParserCtxtPtr ctxt, const xmlChar *ExternalID,
if (ctxt->myDoc == NULL) { if (ctxt->myDoc == NULL) {
ctxt->myDoc = xmlNewDoc(BAD_CAST "1.0"); ctxt->myDoc = xmlNewDoc(BAD_CAST "1.0");
if (ctxt->myDoc == NULL) { if (ctxt->myDoc == NULL) {
xmlErrMemory(ctxt, "New Doc failed"); xmlErrMemory(ctxt);
return; return;
} }
ctxt->myDoc->properties = XML_DOC_INTERNAL; ctxt->myDoc->properties = XML_DOC_INTERNAL;
} }
if ((ctxt->myDoc != NULL) && (ctxt->myDoc->intSubset == NULL) && if ((ctxt->myDoc != NULL) && (ctxt->myDoc->intSubset == NULL) &&
(xmlCreateIntSubset(ctxt->myDoc, NULL, ExternalID, SystemID) == NULL)) { (xmlCreateIntSubset(ctxt->myDoc, NULL, ExternalID, SystemID) == NULL)) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
} }
ctxt->instate = XML_PARSER_DTD; ctxt->instate = XML_PARSER_DTD;
@@ -7416,7 +7403,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) {
while (cur != NULL) { while (cur != NULL) {
nw = xmlDocCopyNode(cur, ctxt->myDoc, 1); nw = xmlDocCopyNode(cur, ctxt->myDoc, 1);
if (nw == NULL) { if (nw == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
} else { } else {
if (nw->_private == NULL) if (nw->_private == NULL)
nw->_private = cur->_private; nw->_private = cur->_private;
@@ -7425,7 +7412,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) {
} }
nw = xmlAddChild(ctxt->node, nw); nw = xmlAddChild(ctxt->node, nw);
if (nw == NULL) if (nw == NULL)
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
} }
if (cur == ent->last) { if (cur == ent->last) {
/* /*
@@ -7466,7 +7453,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) {
cur->parent = NULL; cur->parent = NULL;
nw = xmlDocCopyNode(cur, ctxt->myDoc, 1); nw = xmlDocCopyNode(cur, ctxt->myDoc, 1);
if (nw == NULL) { if (nw == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
} else { } else {
if (nw->_private == NULL) if (nw->_private == NULL)
nw->_private = cur->_private; nw->_private = cur->_private;
@@ -7474,10 +7461,10 @@ xmlParseReference(xmlParserCtxtPtr ctxt) {
firstChild = cur; firstChild = cur;
} }
if (xmlAddChild((xmlNodePtr) ent, nw) == NULL) if (xmlAddChild((xmlNodePtr) ent, nw) == NULL)
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
} }
if (xmlAddChild(ctxt->node, cur) == NULL) if (xmlAddChild(ctxt->node, cur) == NULL)
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
if (cur == last) if (cur == last)
break; break;
cur = next; cur = next;
@@ -7934,9 +7921,6 @@ xmlParsePEReference(xmlParserCtxtPtr ctxt)
xmlFatalErrMsg(ctxt, XML_ERR_PEREF_NO_NAME, "PEReference: no name\n"); xmlFatalErrMsg(ctxt, XML_ERR_PEREF_NO_NAME, "PEReference: no name\n");
return; return;
} }
if (xmlParserDebugEntities)
xmlGenericError(xmlGenericErrorContext,
"PEReference: %s\n", name);
if (RAW != ';') { if (RAW != ';') {
xmlFatalErr(ctxt, XML_ERR_PEREF_SEMICOL_MISSING, NULL); xmlFatalErr(ctxt, XML_ERR_PEREF_SEMICOL_MISSING, NULL);
return; return;
@@ -8076,10 +8060,6 @@ xmlLoadEntityContent(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) {
return(-1); return(-1);
} }
if (xmlParserDebugEntities)
xmlGenericError(xmlGenericErrorContext,
"Reading %s entity content input\n", entity->name);
input = xmlLoadExternalEntity((char *) entity->URI, input = xmlLoadExternalEntity((char *) entity->URI,
(char *) entity->ExternalID, ctxt); (char *) entity->ExternalID, ctxt);
if (input == NULL) { if (input == NULL) {
@@ -8102,7 +8082,7 @@ xmlLoadEntityContent(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) {
ctxt->progressive = 0; ctxt->progressive = 0;
ctxt->inputTab = xmlMalloc(sizeof(xmlParserInputPtr)); ctxt->inputTab = xmlMalloc(sizeof(xmlParserInputPtr));
if (ctxt->inputTab == NULL) { if (ctxt->inputTab == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
xmlFreeInputStream(input); xmlFreeInputStream(input);
goto error; goto error;
} }
@@ -8146,7 +8126,7 @@ xmlLoadEntityContent(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) {
content = xmlBufDetach(input->buf->buffer); content = xmlBufDetach(input->buf->buffer);
if (length > INT_MAX) { if (length > INT_MAX) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto error; goto error;
} }
@@ -8622,7 +8602,7 @@ xmlParseStartTag(xmlParserCtxtPtr ctxt) {
atts = (const xmlChar **) atts = (const xmlChar **)
xmlMalloc(maxatts * sizeof(xmlChar *)); xmlMalloc(maxatts * sizeof(xmlChar *));
if (atts == NULL) { if (atts == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
if (attvalue != NULL) if (attvalue != NULL)
xmlFree(attvalue); xmlFree(attvalue);
goto failed; goto failed;
@@ -8636,7 +8616,7 @@ xmlParseStartTag(xmlParserCtxtPtr ctxt) {
n = (const xmlChar **) xmlRealloc((void *) atts, n = (const xmlChar **) xmlRealloc((void *) atts,
maxatts * sizeof(const xmlChar *)); maxatts * sizeof(const xmlChar *));
if (n == NULL) { if (n == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
if (attvalue != NULL) if (attvalue != NULL)
xmlFree(attvalue); xmlFree(attvalue);
goto failed; goto failed;
@@ -8825,7 +8805,7 @@ xmlParseQNameHashed(xmlParserCtxtPtr ctxt, xmlHashedString *prefix) {
l = xmlDictLookupHashed(ctxt->dict, BASE_PTR + start, l = xmlDictLookupHashed(ctxt->dict, BASE_PTR + start,
CUR_PTR - (BASE_PTR + start)); CUR_PTR - (BASE_PTR + start));
if (l.name == NULL) { if (l.name == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(l); return(l);
} }
xmlNsErr(ctxt, XML_NS_ERR_QNAME, xmlNsErr(ctxt, XML_NS_ERR_QNAME,
@@ -9100,7 +9080,7 @@ xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
if (alloc) *alloc = 1; if (alloc) *alloc = 1;
ret = xmlStrndup(start, last - start); ret = xmlStrndup(start, last - start);
if (ret == NULL) { if (ret == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
} }
@@ -9244,7 +9224,7 @@ xmlParseAttribute2(xmlParserCtxtPtr ctxt,
return (hname); return (hname);
mem_error: mem_error:
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
error: error:
if ((val != NULL) && (*alloc != 0)) if ((val != NULL) && (*alloc != 0))
xmlFree(val); xmlFree(val);
@@ -9361,7 +9341,7 @@ xmlParseStartTag2(xmlParserCtxtPtr ctxt, const xmlChar **pref,
attval = 0; attval = 0;
if (xmlParserNsStartElement(ctxt->nsdb) < 0) { if (xmlParserNsStartElement(ctxt->nsdb) < 0) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
@@ -9432,12 +9412,12 @@ xmlParseStartTag2(xmlParserCtxtPtr ctxt, const xmlChar **pref,
huri = xmlDictLookupHashed(ctxt->dict, attvalue, len); huri = xmlDictLookupHashed(ctxt->dict, attvalue, len);
uri = huri.name; uri = huri.name;
if (uri == NULL) { if (uri == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto next_attr; goto next_attr;
} }
if (*uri != 0) { if (*uri != 0) {
if (xmlParseURISafe((const char *) uri, &parsedUri) < 0) { if (xmlParseURISafe((const char *) uri, &parsedUri) < 0) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto next_attr; goto next_attr;
} }
if (parsedUri == NULL) { if (parsedUri == NULL) {
@@ -9479,7 +9459,7 @@ xmlParseStartTag2(xmlParserCtxtPtr ctxt, const xmlChar **pref,
huri = xmlDictLookupHashed(ctxt->dict, attvalue, len); huri = xmlDictLookupHashed(ctxt->dict, attvalue, len);
uri = huri.name; uri = huri.name;
if (uri == NULL) { if (uri == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto next_attr; goto next_attr;
} }
@@ -9523,7 +9503,7 @@ xmlParseStartTag2(xmlParserCtxtPtr ctxt, const xmlChar **pref,
goto next_attr; goto next_attr;
} else { } else {
if (xmlParseURISafe((const char *) uri, &parsedUri) < 0) { if (xmlParseURISafe((const char *) uri, &parsedUri) < 0) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto next_attr; goto next_attr;
} }
if (parsedUri == NULL) { if (parsedUri == NULL) {
@@ -9683,7 +9663,7 @@ next_attr:
tmp = xmlRealloc(ctxt->attrHash, attrHashSize * sizeof(tmp[0])); tmp = xmlRealloc(ctxt->attrHash, attrHashSize * sizeof(tmp[0]));
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto done; goto done;
} }
@@ -10006,7 +9986,7 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
cur = CUR_CHAR(l); cur = CUR_CHAR(l);
buf = (xmlChar *) xmlMallocAtomic(size); buf = (xmlChar *) xmlMallocAtomic(size);
if (buf == NULL) { if (buf == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto out; goto out;
} }
while (IS_CHAR(cur) && while (IS_CHAR(cur) &&
@@ -10016,7 +9996,7 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
tmp = (xmlChar *) xmlRealloc(buf, size * 2); tmp = (xmlChar *) xmlRealloc(buf, size * 2);
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto out; goto out;
} }
buf = tmp; buf = tmp;
@@ -10385,7 +10365,7 @@ xmlParseVersionNum(xmlParserCtxtPtr ctxt) {
buf = (xmlChar *) xmlMallocAtomic(size); buf = (xmlChar *) xmlMallocAtomic(size);
if (buf == NULL) { if (buf == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
cur = CUR; cur = CUR;
@@ -10411,7 +10391,7 @@ xmlParseVersionNum(xmlParserCtxtPtr ctxt) {
tmp = (xmlChar *) xmlRealloc(buf, size); tmp = (xmlChar *) xmlRealloc(buf, size);
if (tmp == NULL) { if (tmp == NULL) {
xmlFree(buf); xmlFree(buf);
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
buf = tmp; buf = tmp;
@@ -10500,7 +10480,7 @@ xmlParseEncName(xmlParserCtxtPtr ctxt) {
((cur >= 'A') && (cur <= 'Z'))) { ((cur >= 'A') && (cur <= 'Z'))) {
buf = (xmlChar *) xmlMallocAtomic(size); buf = (xmlChar *) xmlMallocAtomic(size);
if (buf == NULL) { if (buf == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
@@ -10518,7 +10498,7 @@ xmlParseEncName(xmlParserCtxtPtr ctxt) {
size *= 2; size *= 2;
tmp = (xmlChar *) xmlRealloc(buf, size); tmp = (xmlChar *) xmlRealloc(buf, size);
if (tmp == NULL) { if (tmp == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
xmlFree(buf); xmlFree(buf);
return(NULL); return(NULL);
} }
@@ -10897,7 +10877,7 @@ xmlParseDocument(xmlParserCtxtPtr ctxt) {
} else { } else {
ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION); ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION);
if (ctxt->version == NULL) { if (ctxt->version == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(-1); return(-1);
} }
} }
@@ -11499,14 +11479,14 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) {
} else { } else {
ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION); ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION);
if (ctxt->version == NULL) { if (ctxt->version == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
break; break;
} }
} }
} else { } else {
ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION); ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION);
if (ctxt->version == NULL) { if (ctxt->version == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
break; break;
} }
} }
@@ -11888,7 +11868,7 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) {
break; break;
} }
default: default:
xmlGenericError(xmlGenericErrorContext, xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR,
"PP: internal error\n"); "PP: internal error\n");
ctxt->instate = XML_PARSER_EOF; ctxt->instate = XML_PARSER_EOF;
break; break;
@@ -12244,7 +12224,7 @@ xmlIOParseDTD(xmlSAXHandlerPtr sax, xmlParserInputBufferPtr input,
ctxt->inSubset = 2; ctxt->inSubset = 2;
ctxt->myDoc = xmlNewDoc(BAD_CAST "1.0"); ctxt->myDoc = xmlNewDoc(BAD_CAST "1.0");
if (ctxt->myDoc == NULL) { if (ctxt->myDoc == NULL) {
xmlErrMemory(ctxt, "New Doc failed"); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
ctxt->myDoc->properties = XML_DOC_INTERNAL; ctxt->myDoc->properties = XML_DOC_INTERNAL;
@@ -12357,7 +12337,7 @@ xmlSAXParseDTD(xmlSAXHandlerPtr sax, const xmlChar *ExternalID,
ctxt->inSubset = 2; ctxt->inSubset = 2;
ctxt->myDoc = xmlNewDoc(BAD_CAST "1.0"); ctxt->myDoc = xmlNewDoc(BAD_CAST "1.0");
if (ctxt->myDoc == NULL) { if (ctxt->myDoc == NULL) {
xmlErrMemory(ctxt, "New Doc failed"); xmlErrMemory(ctxt);
xmlFreeParserCtxt(ctxt); xmlFreeParserCtxt(ctxt);
return(NULL); return(NULL);
} }
@@ -12511,7 +12491,7 @@ xmlParseExternalEntityPrivate(xmlDocPtr doc, xmlParserCtxtPtr oldctxt,
newDoc = xmlNewDoc(BAD_CAST "1.0"); newDoc = xmlNewDoc(BAD_CAST "1.0");
if (newDoc == NULL) { if (newDoc == NULL) {
xmlErrMemory(oldctxt, NULL); xmlErrMemory(oldctxt);
goto error; goto error;
} }
newDoc->properties = XML_DOC_INTERNAL; newDoc->properties = XML_DOC_INTERNAL;
@@ -12525,14 +12505,14 @@ xmlParseExternalEntityPrivate(xmlDocPtr doc, xmlParserCtxtPtr oldctxt,
if (doc->URL != NULL) { if (doc->URL != NULL) {
newDoc->URL = xmlStrdup(doc->URL); newDoc->URL = xmlStrdup(doc->URL);
if (newDoc->URL == NULL) { if (newDoc->URL == NULL) {
xmlErrMemory(oldctxt, NULL); xmlErrMemory(oldctxt);
goto error; goto error;
} }
} }
} }
newRoot = xmlNewDocNode(newDoc, NULL, BAD_CAST "pseudoroot", NULL); newRoot = xmlNewDocNode(newDoc, NULL, BAD_CAST "pseudoroot", NULL);
if (newRoot == NULL) { if (newRoot == NULL) {
xmlErrMemory(oldctxt, NULL); xmlErrMemory(oldctxt);
goto error; goto error;
} }
xmlAddChild((xmlNodePtr) newDoc, newRoot); xmlAddChild((xmlNodePtr) newDoc, newRoot);
@@ -12668,7 +12648,7 @@ error:
if (ctxt->disableSAX > oldctxt->disableSAX) if (ctxt->disableSAX > oldctxt->disableSAX)
oldctxt->disableSAX = ctxt->disableSAX; oldctxt->disableSAX = ctxt->disableSAX;
if (xmlCopyError(&ctxt->lastError, &oldctxt->lastError) < 0) { if (xmlCopyError(&ctxt->lastError, &oldctxt->lastError) < 0) {
xmlErrMemory(oldctxt, NULL); xmlErrMemory(oldctxt);
} }
} }
@@ -12788,14 +12768,18 @@ xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt,
ctxt = xmlCreateDocParserCtxt(string); ctxt = xmlCreateDocParserCtxt(string);
if (ctxt == NULL) { if (ctxt == NULL) {
xmlErrMemory(oldctxt, NULL); xmlErrMemory(oldctxt);
return(XML_ERR_NO_MEMORY); return(XML_ERR_NO_MEMORY);
} }
if (oldctxt->errorHandler != NULL)
xmlCtxtSetErrorHandler(ctxt, oldctxt->errorHandler,
oldctxt->errorCtxt);
if (oldctxt->myDoc == NULL) { if (oldctxt->myDoc == NULL) {
newDoc = xmlNewDoc(BAD_CAST "1.0"); newDoc = xmlNewDoc(BAD_CAST "1.0");
if (newDoc == NULL) { if (newDoc == NULL) {
xmlErrMemory(oldctxt, NULL); xmlErrMemory(oldctxt);
ret = XML_ERR_NO_MEMORY; ret = XML_ERR_NO_MEMORY;
goto error; goto error;
} }
@@ -12810,7 +12794,7 @@ xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt,
} }
newRoot = xmlNewDocNode(ctxt->myDoc, NULL, BAD_CAST "pseudoroot", NULL); newRoot = xmlNewDocNode(ctxt->myDoc, NULL, BAD_CAST "pseudoroot", NULL);
if (newRoot == NULL) { if (newRoot == NULL) {
xmlErrMemory(oldctxt, NULL); xmlErrMemory(oldctxt);
ret = XML_ERR_NO_MEMORY; ret = XML_ERR_NO_MEMORY;
goto error; goto error;
} }
@@ -12911,7 +12895,7 @@ xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt,
if (ctxt->disableSAX > oldctxt->disableSAX) if (ctxt->disableSAX > oldctxt->disableSAX)
oldctxt->disableSAX = ctxt->disableSAX; oldctxt->disableSAX = ctxt->disableSAX;
if (xmlCopyError(&ctxt->lastError, &oldctxt->lastError) < 0) { if (xmlCopyError(&ctxt->lastError, &oldctxt->lastError) < 0) {
xmlErrMemory(oldctxt, NULL); xmlErrMemory(oldctxt);
ret = XML_ERR_NO_MEMORY; ret = XML_ERR_NO_MEMORY;
} }
} else { } else {
@@ -13437,11 +13421,14 @@ xmlCreateEntityParserCtxtInternal(xmlSAXHandlerPtr sax, void *userData,
ctxt = xmlNewSAXParserCtxt(sax, userData); ctxt = xmlNewSAXParserCtxt(sax, userData);
if (ctxt == NULL) { if (ctxt == NULL) {
xmlErrMemory(pctx, NULL); xmlErrMemory(pctx);
return(NULL); return(NULL);
} }
if (pctx != NULL) { if (pctx != NULL) {
if (pctx->errorHandler != NULL)
xmlCtxtSetErrorHandler(ctxt, pctx->errorHandler, pctx->errorCtxt);
ctxt->options = pctx->options; ctxt->options = pctx->options;
ctxt->_private = pctx->_private; ctxt->_private = pctx->_private;
ctxt->input_id = pctx->input_id; ctxt->input_id = pctx->input_id;
@@ -13453,7 +13440,7 @@ xmlCreateEntityParserCtxtInternal(xmlSAXHandlerPtr sax, void *userData,
if (base != NULL) { if (base != NULL) {
if (xmlBuildURISafe(URL, base, &uri) < 0) { if (xmlBuildURISafe(URL, base, &uri) < 0) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto error; goto error;
} }
if (uri != NULL) if (uri != NULL)
@@ -13469,7 +13456,7 @@ xmlCreateEntityParserCtxtInternal(xmlSAXHandlerPtr sax, void *userData,
if (ctxt->directory == NULL) { if (ctxt->directory == NULL) {
ctxt->directory = xmlParserGetDirectory((char *)URL); ctxt->directory = xmlParserGetDirectory((char *)URL);
if (ctxt->directory == NULL) { if (ctxt->directory == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto error; goto error;
} }
} }
@@ -13480,7 +13467,7 @@ xmlCreateEntityParserCtxtInternal(xmlSAXHandlerPtr sax, void *userData,
error: error:
if (pctx != NULL) { if (pctx != NULL) {
if (xmlCopyError(&ctxt->lastError, &pctx->lastError) < 0) { if (xmlCopyError(&ctxt->lastError, &pctx->lastError) < 0) {
xmlErrMemory(pctx, NULL); xmlErrMemory(pctx);
} else { } else {
pctx->errNo = ctxt->errNo; pctx->errNo = ctxt->errNo;
if (ctxt->disableSAX > pctx->disableSAX) if (ctxt->disableSAX > pctx->disableSAX)
@@ -14574,7 +14561,7 @@ xmlDoRead(xmlParserCtxtPtr ctxt, const char *URL, const char *encoding,
(ctxt->input->filename == NULL)) { (ctxt->input->filename == NULL)) {
ctxt->input->filename = (char *) xmlStrdup((const xmlChar *) URL); ctxt->input->filename = (char *) xmlStrdup((const xmlChar *) URL);
if (ctxt->input->filename == NULL) { if (ctxt->input->filename == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
goto error; goto error;
} }
} }
@@ -14871,7 +14858,7 @@ xmlCtxtReadMemory(xmlParserCtxtPtr ctxt, const char *buffer, int size,
input = xmlParserInputBufferCreateStatic(buffer, size, input = xmlParserInputBufferCreateStatic(buffer, size,
XML_CHAR_ENCODING_NONE); XML_CHAR_ENCODING_NONE);
if (input == NULL) { if (input == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }

View File

@@ -62,7 +62,6 @@
* @version: the include version number * @version: the include version number
* *
* check the compiled lib version against the include one. * check the compiled lib version against the include one.
* This can warn or immediately kill the application
*/ */
void void
xmlCheckVersion(int version) { xmlCheckVersion(int version) {
@@ -71,15 +70,11 @@ xmlCheckVersion(int version) {
xmlInitParser(); xmlInitParser();
if ((myversion / 10000) != (version / 10000)) { if ((myversion / 10000) != (version / 10000)) {
xmlGenericError(xmlGenericErrorContext,
"Fatal: program compiled against libxml %d using libxml %d\n",
(version / 10000), (myversion / 10000));
fprintf(stderr, fprintf(stderr,
"Fatal: program compiled against libxml %d using libxml %d\n", "Fatal: program compiled against libxml %d using libxml %d\n",
(version / 10000), (myversion / 10000)); (version / 10000), (myversion / 10000));
} } else if ((myversion / 100) < (version / 100)) {
if ((myversion / 100) < (version / 100)) { fprintf(stderr,
xmlGenericError(xmlGenericErrorContext,
"Warning: program compiled against libxml %d using older %d\n", "Warning: program compiled against libxml %d using older %d\n",
(version / 100), (myversion / 100)); (version / 100), (myversion / 100));
} }
@@ -94,49 +89,56 @@ xmlCheckVersion(int version) {
/** /**
* xmlErrMemory: * xmlCtxtSetErrorHandler:
* @ctxt: an XML parser context * @ctxt: an XML parser context
* @extra: extra information * @handler: error handler
* @data: data for error handler
* *
* Handle a redefinition of attribute error * Set an error handler for a parser context.
*/ */
void void
xmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra ATTRIBUTE_UNUSED) xmlCtxtSetErrorHandler(xmlParserCtxtPtr ctxt, xmlStructuredErrorFunc handler,
void *data)
{ {
xmlError *lastError = &xmlLastError; if (ctxt == NULL)
return;
ctxt->errorHandler = handler;
ctxt->errorCtxt = data;
}
xmlResetLastError(); /**
lastError->domain = XML_FROM_PARSER; * xmlCtxtErrMemory:
lastError->code = XML_ERR_NO_MEMORY; * @ctxt: an XML parser context
lastError->level = XML_ERR_FATAL; * @domain: domain
*
* Handle an out-of-memory error
*/
void
xmlCtxtErrMemory(xmlParserCtxtPtr ctxt)
{
xmlStructuredErrorFunc schannel = NULL;
xmlGenericErrorFunc channel = NULL;
void *data;
ctxt->errNo = XML_ERR_NO_MEMORY; ctxt->errNo = XML_ERR_NO_MEMORY;
ctxt->instate = XML_PARSER_EOF; /* TODO: Remove after refactoring */ ctxt->instate = XML_PARSER_EOF; /* TODO: Remove after refactoring */
ctxt->wellFormed = 0; ctxt->wellFormed = 0;
ctxt->disableSAX = 2; ctxt->disableSAX = 2;
xmlResetError(&ctxt->lastError); if (ctxt->errorHandler) {
ctxt->lastError.domain = XML_FROM_PARSER; schannel = ctxt->errorHandler;
ctxt->lastError.code = XML_ERR_NO_MEMORY; data = ctxt->errorCtxt;
ctxt->lastError.level = XML_ERR_FATAL; } else if ((ctxt->sax->initialized == XML_SAX2_MAGIC) &&
if ((ctxt->sax->initialized == XML_SAX2_MAGIC) &&
(ctxt->sax->serror != NULL)) { (ctxt->sax->serror != NULL)) {
ctxt->sax->serror(ctxt->userData, &ctxt->lastError); schannel = ctxt->sax->serror;
} else if (xmlStructuredError != NULL) { data = ctxt->userData;
xmlStructuredError(ctxt->userData, &ctxt->lastError);
} else { } else {
xmlGenericErrorFunc channel = ctxt->sax->error; channel = ctxt->sax->error;
data = ctxt->userData;
if ((channel == xmlParserError) ||
(channel == xmlParserWarning) ||
(channel == xmlParserValidityError) ||
(channel == xmlParserValidityWarning))
channel = xmlGenericError;
if (channel != NULL)
channel(ctxt->userData, "parser error : out of memory\n");
} }
xmlRaiseMemoryError(schannel, channel, data, XML_FROM_PARSER,
&ctxt->lastError);
} }
void void
@@ -146,7 +148,7 @@ xmlVErrParser(xmlParserCtxtPtr ctxt, xmlNodePtr node,
int int1, const char *msg, va_list ap) int int1, const char *msg, va_list ap)
{ {
xmlStructuredErrorFunc schannel = NULL; xmlStructuredErrorFunc schannel = NULL;
xmlGenericErrorFunc channel; xmlGenericErrorFunc channel = NULL;
void *data; void *data;
const char *file = NULL; const char *file = NULL;
int line = 0; int line = 0;
@@ -157,7 +159,7 @@ xmlVErrParser(xmlParserCtxtPtr ctxt, xmlNodePtr node,
return; return;
if (code == XML_ERR_NO_MEMORY) { if (code == XML_ERR_NO_MEMORY) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return; return;
} }
@@ -171,10 +173,14 @@ xmlVErrParser(xmlParserCtxtPtr ctxt, xmlNodePtr node,
ctxt->nbErrors += 1; ctxt->nbErrors += 1;
} }
if (ctxt->sax->initialized == XML_SAX2_MAGIC) if (ctxt->errorHandler) {
schannel = ctxt->errorHandler;
data = ctxt->errorCtxt;
} else if ((ctxt->sax->initialized == XML_SAX2_MAGIC) &&
(ctxt->sax->serror != NULL)) {
schannel = ctxt->sax->serror; schannel = ctxt->sax->serror;
data = ctxt->userData;
if ((domain == XML_FROM_VALID) || (domain == XML_FROM_DTD)) { } else if ((domain == XML_FROM_VALID) || (domain == XML_FROM_DTD)) {
if (level == XML_ERR_WARNING) if (level == XML_ERR_WARNING)
channel = ctxt->vctxt.warning; channel = ctxt->vctxt.warning;
else else
@@ -206,7 +212,7 @@ xmlVErrParser(xmlParserCtxtPtr ctxt, xmlNodePtr node,
msg, ap); msg, ap);
if (res < 0) { if (res < 0) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return; return;
} }
@@ -1357,7 +1363,7 @@ xmlSwitchInputEncoding(xmlParserCtxtPtr ctxt, xmlParserInputPtr input,
buf = xmlBufCreate(); buf = xmlBufCreate();
if (buf == NULL) { if (buf == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(-1); return(-1);
} }
@@ -1375,7 +1381,7 @@ xmlSwitchInputEncoding(xmlParserCtxtPtr ctxt, xmlParserInputPtr input,
nbchars = xmlCharEncInput(in); nbchars = xmlCharEncInput(in);
xmlBufResetInput(in->buffer, input); xmlBufResetInput(in->buffer, input);
if (nbchars == XML_ENC_ERR_MEMORY) { if (nbchars == XML_ENC_ERR_MEMORY) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
} else if (nbchars < 0) { } else if (nbchars < 0) {
xmlErrInternal(ctxt, xmlErrInternal(ctxt,
"switching encoding: encoder error\n", "switching encoding: encoder error\n",
@@ -1573,7 +1579,7 @@ xmlSetDeclaredEncoding(xmlParserCtxtPtr ctxt, xmlChar *encoding) {
xmlFree(encoding); xmlFree(encoding);
encoding = xmlStrdup(BAD_CAST autoEnc); encoding = xmlStrdup(BAD_CAST autoEnc);
if (encoding == NULL) if (encoding == NULL)
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
} }
} }
} }
@@ -1623,7 +1629,7 @@ xmlNewInputStream(xmlParserCtxtPtr ctxt) {
input = (xmlParserInputPtr) xmlMalloc(sizeof(xmlParserInput)); input = (xmlParserInputPtr) xmlMalloc(sizeof(xmlParserInput));
if (input == NULL) { if (input == NULL) {
xmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
memset(input, 0, sizeof(xmlParserInput)); memset(input, 0, sizeof(xmlParserInput));
@@ -1637,7 +1643,7 @@ xmlNewInputStream(xmlParserCtxtPtr ctxt) {
*/ */
if (ctxt != NULL) { if (ctxt != NULL) {
if (input->id >= INT_MAX) { if (input->id >= INT_MAX) {
xmlErrMemory(ctxt, "Input ID overflow\n"); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
input->id = ctxt->input_id++; input->id = ctxt->input_id++;
@@ -1663,8 +1669,6 @@ xmlNewIOInputStream(xmlParserCtxtPtr ctxt, xmlParserInputBufferPtr input,
xmlParserInputPtr inputStream; xmlParserInputPtr inputStream;
if (input == NULL) return(NULL); if (input == NULL) return(NULL);
if (xmlParserDebugEntities)
xmlGenericError(xmlGenericErrorContext, "new input from I/O\n");
inputStream = xmlNewInputStream(ctxt); inputStream = xmlNewInputStream(ctxt);
if (inputStream == NULL) { if (inputStream == NULL) {
return(NULL); return(NULL);
@@ -1700,9 +1704,6 @@ xmlNewEntityInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) {
NULL); NULL);
return(NULL); return(NULL);
} }
if (xmlParserDebugEntities)
xmlGenericError(xmlGenericErrorContext,
"new input from entity: %s\n", entity->name);
if (entity->content == NULL) { if (entity->content == NULL) {
switch (entity->etype) { switch (entity->etype) {
case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
@@ -1768,17 +1769,14 @@ xmlNewStringInputStream(xmlParserCtxtPtr ctxt, const xmlChar *buffer) {
NULL); NULL);
return(NULL); return(NULL);
} }
if (xmlParserDebugEntities)
xmlGenericError(xmlGenericErrorContext,
"new fixed input: %.30s\n", buffer);
buf = xmlParserInputBufferCreateString(buffer); buf = xmlParserInputBufferCreateString(buffer);
if (buf == NULL) { if (buf == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(NULL); return(NULL);
} }
input = xmlNewInputStream(ctxt); input = xmlNewInputStream(ctxt);
if (input == NULL) { if (input == NULL) {
xmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); xmlErrMemory(ctxt);
xmlFreeParserInputBuffer(buf); xmlFreeParserInputBuffer(buf);
return(NULL); return(NULL);
} }
@@ -1803,9 +1801,6 @@ xmlNewInputFromFile(xmlParserCtxtPtr ctxt, const char *filename) {
char *directory = NULL; char *directory = NULL;
xmlChar *URI = NULL; xmlChar *URI = NULL;
if (xmlParserDebugEntities)
xmlGenericError(xmlGenericErrorContext,
"new input from file: %s\n", filename);
if (ctxt == NULL) return(NULL); if (ctxt == NULL) return(NULL);
buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE); buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE);
if (buf == NULL) { if (buf == NULL) {
@@ -2007,7 +2002,7 @@ xmlInitSAXParserCtxt(xmlParserCtxtPtr ctxt, const xmlSAXHandler *sax,
if (ctxt->nsdb == NULL) { if (ctxt->nsdb == NULL) {
ctxt->nsdb = xmlParserNsCreate(); ctxt->nsdb = xmlParserNsCreate();
if (ctxt->nsdb == NULL) { if (ctxt->nsdb == NULL) {
xmlErrMemory(ctxt, NULL); xmlErrMemory(ctxt);
return(-1); return(-1);
} }
} }
@@ -2341,7 +2336,7 @@ xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt,
byte_size); byte_size);
if (tmp_buffer == NULL) { if (tmp_buffer == NULL) {
xmlErrMemory(ctxt, "failed to allocate buffer\n"); xmlErrMemory(ctxt);
return; return;
} }
ctxt->node_seq.buffer = tmp_buffer; ctxt->node_seq.buffer = tmp_buffer;

100
valid.c
View File

@@ -30,11 +30,6 @@
static xmlElementPtr static xmlElementPtr
xmlGetDtdElementDesc2(xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, const xmlChar *name); xmlGetDtdElementDesc2(xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, const xmlChar *name);
#define TODO \
xmlGenericError(xmlGenericErrorContext, \
"Unimplemented block at %s:%d\n", \
__FILE__, __LINE__);
#ifdef LIBXML_VALID_ENABLED #ifdef LIBXML_VALID_ENABLED
static int static int
xmlValidateAttributeValueInternal(xmlDocPtr doc, xmlAttributeType type, xmlValidateAttributeValueInternal(xmlDocPtr doc, xmlAttributeType type,
@@ -54,21 +49,17 @@ xmlValidateAttributeValueInternal(xmlDocPtr doc, xmlAttributeType type,
* Handle an out of memory error * Handle an out of memory error
*/ */
static void static void
xmlVErrMemory(xmlValidCtxtPtr ctxt, const char *extra) xmlVErrMemory(xmlValidCtxtPtr ctxt)
{ {
if (ctxt != NULL) { if (ctxt != NULL) {
if (ctxt->flags & XML_VCTXT_USE_PCTXT) { if (ctxt->flags & XML_VCTXT_USE_PCTXT) {
xmlParserCtxtPtr pctxt = ctxt->userData; xmlCtxtErrMemory(ctxt->userData);
xmlErrMemory(pctxt, extra);
} else { } else {
xmlError *lastError = &xmlLastError; xmlRaiseMemoryError(NULL, ctxt->error, ctxt->userData,
XML_FROM_VALID, NULL);
xmlResetLastError();
lastError->domain = XML_FROM_PARSER;
lastError->code = XML_ERR_NO_MEMORY;
lastError->level = XML_ERR_FATAL;
} }
} else {
xmlRaiseMemoryError(NULL, NULL, NULL, XML_FROM_VALID, NULL);
} }
} }
@@ -91,18 +82,19 @@ xmlDoErrValid(xmlValidCtxtPtr ctxt, xmlNodePtr node,
} else { } else {
xmlGenericErrorFunc channel = NULL; xmlGenericErrorFunc channel = NULL;
void *data = NULL; void *data = NULL;
int res;
if (ctxt != NULL) { if (ctxt != NULL) {
channel = ctxt->error; channel = ctxt->error;
data = ctxt->userData; data = ctxt->userData;
} }
xmlVRaiseError(NULL, channel, data, NULL, node, res = xmlVRaiseError(NULL, channel, data, NULL, node,
XML_FROM_VALID, code, level, XML_FROM_VALID, code, level, NULL, 0,
NULL, 0, (const char *) str1, (const char *) str2,
(const char *) str1, (const char *) str2, (const char *) str2, int1, 0,
(const char *) str2, msg, ap);
int1, 0, if (res < 0)
msg, ap); xmlVErrMemory(ctxt);
} }
va_end(ap); va_end(ap);
} }
@@ -215,7 +207,7 @@ vstateVPush(xmlValidCtxtPtr ctxt, xmlElementPtr elemDecl, xmlNodePtr node) {
ctxt->vstateTab = (xmlValidState *) xmlMalloc(ctxt->vstateMax * ctxt->vstateTab = (xmlValidState *) xmlMalloc(ctxt->vstateMax *
sizeof(ctxt->vstateTab[0])); sizeof(ctxt->vstateTab[0]));
if (ctxt->vstateTab == NULL) { if (ctxt->vstateTab == NULL) {
xmlVErrMemory(ctxt, "malloc failed"); xmlVErrMemory(ctxt);
return(-1); return(-1);
} }
} }
@@ -226,7 +218,7 @@ vstateVPush(xmlValidCtxtPtr ctxt, xmlElementPtr elemDecl, xmlNodePtr node) {
tmp = (xmlValidState *) xmlRealloc(ctxt->vstateTab, tmp = (xmlValidState *) xmlRealloc(ctxt->vstateTab,
2 * ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); 2 * ctxt->vstateMax * sizeof(ctxt->vstateTab[0]));
if (tmp == NULL) { if (tmp == NULL) {
xmlVErrMemory(ctxt, "realloc failed"); xmlVErrMemory(ctxt);
return(-1); return(-1);
} }
ctxt->vstateMax *= 2; ctxt->vstateMax *= 2;
@@ -242,7 +234,7 @@ vstateVPush(xmlValidCtxtPtr ctxt, xmlElementPtr elemDecl, xmlNodePtr node) {
ctxt->vstateTab[ctxt->vstateNr].exec = ctxt->vstateTab[ctxt->vstateNr].exec =
xmlRegNewExecCtxt(elemDecl->contModel, NULL, NULL); xmlRegNewExecCtxt(elemDecl->contModel, NULL, NULL);
if (ctxt->vstateTab[ctxt->vstateNr].exec == NULL) { if (ctxt->vstateTab[ctxt->vstateNr].exec == NULL) {
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
return(-1); return(-1);
} }
} else { } else {
@@ -326,7 +318,7 @@ vstateVPush(xmlValidCtxtPtr ctxt, xmlElementContentPtr cont,
ctxt->vstateTab = (xmlValidState *) xmlMalloc( ctxt->vstateTab = (xmlValidState *) xmlMalloc(
ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); ctxt->vstateMax * sizeof(ctxt->vstateTab[0]));
if (ctxt->vstateTab == NULL) { if (ctxt->vstateTab == NULL) {
xmlVErrMemory(ctxt, "malloc failed"); xmlVErrMemory(ctxt);
return(-1); return(-1);
} }
} }
@@ -336,7 +328,7 @@ vstateVPush(xmlValidCtxtPtr ctxt, xmlElementContentPtr cont,
tmp = (xmlValidState *) xmlRealloc(ctxt->vstateTab, tmp = (xmlValidState *) xmlRealloc(ctxt->vstateTab,
2 * ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); 2 * ctxt->vstateMax * sizeof(ctxt->vstateTab[0]));
if (tmp == NULL) { if (tmp == NULL) {
xmlVErrMemory(ctxt, "malloc failed"); xmlVErrMemory(ctxt);
return(-1); return(-1);
} }
ctxt->vstateMax *= 2; ctxt->vstateMax *= 2;
@@ -384,7 +376,7 @@ nodeVPush(xmlValidCtxtPtr ctxt, xmlNodePtr value)
(xmlNodePtr *) xmlMalloc(ctxt->nodeMax * (xmlNodePtr *) xmlMalloc(ctxt->nodeMax *
sizeof(ctxt->nodeTab[0])); sizeof(ctxt->nodeTab[0]));
if (ctxt->nodeTab == NULL) { if (ctxt->nodeTab == NULL) {
xmlVErrMemory(ctxt, "malloc failed"); xmlVErrMemory(ctxt);
ctxt->nodeMax = 0; ctxt->nodeMax = 0;
return (0); return (0);
} }
@@ -394,7 +386,7 @@ nodeVPush(xmlValidCtxtPtr ctxt, xmlNodePtr value)
tmp = (xmlNodePtr *) xmlRealloc(ctxt->nodeTab, tmp = (xmlNodePtr *) xmlRealloc(ctxt->nodeTab,
ctxt->nodeMax * 2 * sizeof(ctxt->nodeTab[0])); ctxt->nodeMax * 2 * sizeof(ctxt->nodeTab[0]));
if (tmp == NULL) { if (tmp == NULL) {
xmlVErrMemory(ctxt, "realloc failed"); xmlVErrMemory(ctxt);
return (0); return (0);
} }
ctxt->nodeMax *= 2; ctxt->nodeMax *= 2;
@@ -471,7 +463,7 @@ xmlValidBuildAContentModel(xmlElementContentPtr content,
fullname = xmlBuildQName(content->name, content->prefix, fn, 50); fullname = xmlBuildQName(content->name, content->prefix, fn, 50);
if (fullname == NULL) { if (fullname == NULL) {
xmlVErrMemory(ctxt, "Building content model"); xmlVErrMemory(ctxt);
return(0); return(0);
} }
@@ -622,7 +614,7 @@ xmlValidBuildContentModel(xmlValidCtxtPtr ctxt, xmlElementPtr elem) {
ctxt->am = xmlNewAutomata(); ctxt->am = xmlNewAutomata();
if (ctxt->am == NULL) { if (ctxt->am == NULL) {
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
return(0); return(0);
} }
ctxt->state = xmlAutomataGetInitState(ctxt->am); ctxt->state = xmlAutomataGetInitState(ctxt->am);
@@ -630,7 +622,7 @@ xmlValidBuildContentModel(xmlValidCtxtPtr ctxt, xmlElementPtr elem) {
xmlAutomataSetFinalState(ctxt->am, ctxt->state); xmlAutomataSetFinalState(ctxt->am, ctxt->state);
elem->contModel = xmlAutomataCompile(ctxt->am); elem->contModel = xmlAutomataCompile(ctxt->am);
if (elem->contModel == NULL) { if (elem->contModel == NULL) {
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
goto done; goto done;
} }
if (xmlRegexpIsDeterminist(elem->contModel) != 1) { if (xmlRegexpIsDeterminist(elem->contModel) != 1) {
@@ -1428,7 +1420,7 @@ xmlAddElementDecl(xmlValidCtxtPtr ctxt,
return(ret); return(ret);
mem_error: mem_error:
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
if (prefix != NULL) if (prefix != NULL)
xmlFree(prefix); xmlFree(prefix);
return(NULL); return(NULL);
@@ -1933,7 +1925,7 @@ xmlAddAttributeDecl(xmlValidCtxtPtr ctxt,
else else
ret->defaultValue = xmlStrdup(defaultValue); ret->defaultValue = xmlStrdup(defaultValue);
if (ret->defaultValue == NULL) if (ret->defaultValue == NULL)
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
} }
/* /*
@@ -2019,7 +2011,7 @@ xmlAddAttributeDecl(xmlValidCtxtPtr ctxt,
return(ret); return(ret);
mem_error: mem_error:
xmlVErrMemory(ctxt, "malloc failed"); xmlVErrMemory(ctxt);
xmlFreeEnumeration(tree); xmlFreeEnumeration(tree);
xmlFreeAttribute(ret); xmlFreeAttribute(ret);
return(NULL); return(NULL);
@@ -2329,7 +2321,7 @@ xmlAddNotationDecl(xmlValidCtxtPtr ctxt, xmlDtdPtr dtd,
return(ret); return(ret);
mem_error: mem_error:
xmlVErrMemory(ctxt, "malloc failed"); xmlVErrMemory(ctxt);
xmlFreeNotation(ret); xmlFreeNotation(ret);
return(NULL); return(NULL);
} }
@@ -2621,7 +2613,7 @@ xmlAddID(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value,
res = xmlAddIDSafe(doc, value, attr, xmlIsStreaming(ctxt), &id); res = xmlAddIDSafe(doc, value, attr, xmlIsStreaming(ctxt), &id);
if (res < 0) { if (res < 0) {
xmlVErrMemory(ctxt, "malloc failed"); xmlVErrMemory(ctxt);
} }
#ifdef LIBXML_VALID_ENABLED #ifdef LIBXML_VALID_ENABLED
else if (res == 0) { else if (res == 0) {
@@ -2961,7 +2953,7 @@ xmlAddRef(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value,
return(ret); return(ret);
failed: failed:
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
if (ret != NULL) { if (ret != NULL) {
if (ret->value != NULL) if (ret->value != NULL)
xmlFree((char *)ret->value); xmlFree((char *)ret->value);
@@ -3224,7 +3216,7 @@ xmlGetDtdElementDesc2(xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, const xmlChar *name)
return(cur); return(cur);
mem_error: mem_error:
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
xmlFree(prefix); xmlFree(prefix);
xmlFreeElement(cur); xmlFreeElement(cur);
return(NULL); return(NULL);
@@ -3464,7 +3456,7 @@ xmlCtxtGetDtdElementDesc(xmlValidCtxtPtr ctxt, xmlDtdPtr dtd,
localName = xmlSplitQName4(name, &prefix); localName = xmlSplitQName4(name, &prefix);
if (localName == NULL) { if (localName == NULL) {
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
return(NULL); return(NULL);
} }
cur = xmlHashLookup2(table, localName, prefix); cur = xmlHashLookup2(table, localName, prefix);
@@ -3944,7 +3936,7 @@ xmlValidateAttributeValue2(xmlValidCtxtPtr ctxt, xmlDocPtr doc,
dup = xmlStrdup(value); dup = xmlStrdup(value);
if (dup == NULL) { if (dup == NULL) {
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
return(0); return(0);
} }
cur = dup; cur = dup;
@@ -4086,7 +4078,7 @@ xmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt, xmlDocPtr doc,
return(ret); return(ret);
mem_error: mem_error:
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
done: done:
xmlFree(prefix); xmlFree(prefix);
@@ -4429,7 +4421,7 @@ xmlValidateOneAttribute(xmlValidCtxtPtr ctxt, xmlDocPtr doc,
fullname = xmlBuildQName(elem->name, elem->ns->prefix, fn, 50); fullname = xmlBuildQName(elem->name, elem->ns->prefix, fn, 50);
if (fullname == NULL) { if (fullname == NULL) {
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
return(0); return(0);
} }
attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, fullname, attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, fullname,
@@ -4593,7 +4585,7 @@ xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value) {
fullname = xmlBuildQName(elem->name, prefix, fn, 50); fullname = xmlBuildQName(elem->name, prefix, fn, 50);
if (fullname == NULL) { if (fullname == NULL) {
xmlVErrMemory(ctxt, "Validating namespace"); xmlVErrMemory(ctxt);
return(0); return(0);
} }
if (ns->prefix != NULL) { if (ns->prefix != NULL) {
@@ -5274,7 +5266,7 @@ xmlValidateElementContent(xmlValidCtxtPtr ctxt, xmlNodePtr child,
ctxt->nodeTab = NULL; ctxt->nodeTab = NULL;
exec = xmlRegNewExecCtxt(elemDecl->contModel, NULL, NULL); exec = xmlRegNewExecCtxt(elemDecl->contModel, NULL, NULL);
if (exec == NULL) { if (exec == NULL) {
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
return(-1); return(-1);
} }
cur = child; cur = child;
@@ -5309,7 +5301,7 @@ xmlValidateElementContent(xmlValidCtxtPtr ctxt, xmlNodePtr child,
fullname = xmlBuildQName(cur->name, fullname = xmlBuildQName(cur->name,
cur->ns->prefix, fn, 50); cur->ns->prefix, fn, 50);
if (fullname == NULL) { if (fullname == NULL) {
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
ret = -1; ret = -1;
goto fail; goto fail;
} }
@@ -5324,7 +5316,7 @@ xmlValidateElementContent(xmlValidCtxtPtr ctxt, xmlNodePtr child,
break; break;
} }
if (ret == XML_REGEXP_OUT_OF_MEMORY) if (ret == XML_REGEXP_OUT_OF_MEMORY)
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
/* /*
* Switch to next element * Switch to next element
*/ */
@@ -5348,7 +5340,7 @@ fail:
ctxt->vstateTab = (xmlValidState *) xmlMalloc( ctxt->vstateTab = (xmlValidState *) xmlMalloc(
ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); ctxt->vstateMax * sizeof(ctxt->vstateTab[0]));
if (ctxt->vstateTab == NULL) { if (ctxt->vstateTab == NULL) {
xmlVErrMemory(ctxt, "malloc failed"); xmlVErrMemory(ctxt);
return(-1); return(-1);
} }
/* /*
@@ -5407,7 +5399,7 @@ fail:
*/ */
tmp = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); tmp = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
if (tmp == NULL) { if (tmp == NULL) {
xmlVErrMemory(ctxt, "malloc failed"); xmlVErrMemory(ctxt);
xmlFreeNodeList(repl); xmlFreeNodeList(repl);
ret = -1; ret = -1;
goto done; goto done;
@@ -5800,7 +5792,7 @@ xmlValidatePushElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc,
if (state->exec != NULL) { if (state->exec != NULL) {
ret = xmlRegExecPushString(state->exec, qname, NULL); ret = xmlRegExecPushString(state->exec, qname, NULL);
if (ret == XML_REGEXP_OUT_OF_MEMORY) { if (ret == XML_REGEXP_OUT_OF_MEMORY) {
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
return(0); return(0);
} }
if (ret < 0) { if (ret < 0) {
@@ -6361,7 +6353,7 @@ xmlValidateRoot(xmlValidCtxtPtr ctxt, xmlDocPtr doc) {
fullname = xmlBuildQName(root->name, root->ns->prefix, fn, 50); fullname = xmlBuildQName(root->name, root->ns->prefix, fn, 50);
if (fullname == NULL) { if (fullname == NULL) {
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
return(0); return(0);
} }
ret = xmlStrEqual(doc->intSubset->name, fullname); ret = xmlStrEqual(doc->intSubset->name, fullname);
@@ -6416,7 +6408,7 @@ xmlValidateElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr root) {
while (attr != NULL) { while (attr != NULL) {
value = xmlNodeListGetString(doc, attr->children, 0); value = xmlNodeListGetString(doc, attr->children, 0);
if (value == NULL) if (value == NULL)
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
ret &= xmlValidateOneAttribute(ctxt, doc, elem, attr, value); ret &= xmlValidateOneAttribute(ctxt, doc, elem, attr, value);
if (value != NULL) if (value != NULL)
xmlFree((char *)value); xmlFree((char *)value);
@@ -6478,7 +6470,7 @@ xmlValidateRef(xmlRefPtr ref, xmlValidCtxtPtr ctxt,
dup = xmlStrdup(name); dup = xmlStrdup(name);
if (dup == NULL) { if (dup == NULL) {
xmlVErrMemory(ctxt, NULL); xmlVErrMemory(ctxt);
return; return;
} }
cur = dup; cur = dup;
@@ -6513,7 +6505,7 @@ xmlValidateRef(xmlRefPtr ref, xmlValidCtxtPtr ctxt,
dup = xmlStrdup(name); dup = xmlStrdup(name);
if (dup == NULL) { if (dup == NULL) {
xmlVErrMemory(ctxt, "IDREFS split"); xmlVErrMemory(ctxt);
ctxt->valid = 0; ctxt->valid = 0;
return; return;
} }

24
xmlIO.c
View File

@@ -202,7 +202,6 @@ __xmlIOWin32UTF8ToWChar(const char *u8String)
} }
#endif #endif
#if defined(LIBXML_HTTP_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
/** /**
* xmlIOErrMemory: * xmlIOErrMemory:
* @extra: extra information * @extra: extra information
@@ -210,11 +209,10 @@ __xmlIOWin32UTF8ToWChar(const char *u8String)
* Handle an out of memory condition * Handle an out of memory condition
*/ */
static void static void
xmlIOErrMemory(const char *extra) xmlIOErrMemory(void)
{ {
__xmlSimpleError(XML_FROM_IO, XML_ERR_NO_MEMORY, NULL, NULL, extra); xmlRaiseMemoryError(NULL, NULL, NULL, XML_FROM_IO, NULL);
} }
#endif
/** /**
* __xmlIOErr: * __xmlIOErr:
@@ -228,6 +226,7 @@ void
__xmlIOErr(int domain, int code, const char *extra) __xmlIOErr(int domain, int code, const char *extra)
{ {
unsigned int idx; unsigned int idx;
int res;
if (code == 0) { if (code == 0) {
if (errno == 0) code = 0; if (errno == 0) code = 0;
@@ -390,7 +389,12 @@ __xmlIOErr(int domain, int code, const char *extra)
if (code >= XML_IO_UNKNOWN) idx = code - XML_IO_UNKNOWN; if (code >= XML_IO_UNKNOWN) idx = code - XML_IO_UNKNOWN;
if (idx >= (sizeof(IOerr) / sizeof(IOerr[0]))) idx = 0; if (idx >= (sizeof(IOerr) / sizeof(IOerr[0]))) idx = 0;
__xmlSimpleError(domain, code, NULL, IOerr[idx], extra); res = __xmlRaiseError(NULL, NULL, NULL, NULL, NULL,
domain, code, XML_ERR_ERROR, NULL, 0,
extra, NULL, NULL, 0, 0,
IOerr[idx], extra);
if (res < 0)
xmlIOErrMemory();
} }
/** /**
@@ -1460,7 +1464,7 @@ xmlCreateZMemBuff( int compression ) {
buff = xmlMalloc( sizeof( xmlZMemBuff ) ); buff = xmlMalloc( sizeof( xmlZMemBuff ) );
if ( buff == NULL ) { if ( buff == NULL ) {
xmlIOErrMemory("creating buffer context"); xmlIOErrMemory();
return ( NULL ); return ( NULL );
} }
@@ -1469,7 +1473,7 @@ xmlCreateZMemBuff( int compression ) {
buff->zbuff = xmlMalloc( buff->size ); buff->zbuff = xmlMalloc( buff->size );
if ( buff->zbuff == NULL ) { if ( buff->zbuff == NULL ) {
xmlFreeZMemBuff( buff ); xmlFreeZMemBuff( buff );
xmlIOErrMemory("creating buffer"); xmlIOErrMemory();
return ( NULL ); return ( NULL );
} }
@@ -1753,7 +1757,7 @@ xmlIOHTTPOpenW(const char *post_uri, int compression ATTRIBUTE_UNUSED)
ctxt = xmlMalloc(sizeof(xmlIOHTTPWriteCtxt)); ctxt = xmlMalloc(sizeof(xmlIOHTTPWriteCtxt));
if (ctxt == NULL) { if (ctxt == NULL) {
xmlIOErrMemory("creating HTTP output context"); xmlIOErrMemory();
return (NULL); return (NULL);
} }
@@ -1761,7 +1765,7 @@ xmlIOHTTPOpenW(const char *post_uri, int compression ATTRIBUTE_UNUSED)
ctxt->uri = (char *) xmlStrdup((const xmlChar *)post_uri); ctxt->uri = (char *) xmlStrdup((const xmlChar *)post_uri);
if (ctxt->uri == NULL) { if (ctxt->uri == NULL) {
xmlIOErrMemory("copying URI"); xmlIOErrMemory();
xmlFreeHTTPWriteCtxt(ctxt); xmlFreeHTTPWriteCtxt(ctxt);
return (NULL); return (NULL);
} }
@@ -4009,7 +4013,7 @@ xmlLoadExternalEntity(const char *URL, const char *ID,
canonicFilename = (char *) xmlCanonicPath((const xmlChar *) URL); canonicFilename = (char *) xmlCanonicPath((const xmlChar *) URL);
if (canonicFilename == NULL) { if (canonicFilename == NULL) {
xmlErrMemory(ctxt, "building canonical path\n"); xmlCtxtErrMemory(ctxt);
return(NULL); return(NULL);
} }

View File

@@ -206,7 +206,7 @@ static void xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur);
static void static void
xmlTextReaderErrMemory(xmlTextReaderPtr reader) { xmlTextReaderErrMemory(xmlTextReaderPtr reader) {
xmlErrMemory(reader->ctxt, NULL); xmlCtxtErrMemory(reader->ctxt);
reader->mode = XML_TEXTREADER_MODE_ERROR; reader->mode = XML_TEXTREADER_MODE_ERROR;
reader->state = XML_TEXTREADER_ERROR; reader->state = XML_TEXTREADER_ERROR;
} }

View File

@@ -4509,7 +4509,7 @@ xmlTextWriterStartDocumentCallback(void *ctx)
if (ctxt->myDoc == NULL) if (ctxt->myDoc == NULL)
ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL); ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL);
if (ctxt->myDoc == NULL) { if (ctxt->myDoc == NULL) {
xmlErrMemory(ctxt, NULL); xmlCtxtErrMemory(ctxt);
return; return;
} }
} else } else
@@ -4527,7 +4527,7 @@ xmlTextWriterStartDocumentCallback(void *ctx)
doc->standalone = ctxt->standalone; doc->standalone = ctxt->standalone;
} }
} else { } else {
xmlErrMemory(ctxt, NULL); xmlCtxtErrMemory(ctxt);
return; return;
} }
} }