Skip to content

Commit

Permalink
many further little changes for OOM problems. Now seems to be getting
Browse files Browse the repository at this point in the history
* SAX2.c, encoding.c, error.c, parser.c, tree.c, uri.c, xmlIO.c,
  xmlreader.c, include/libxml/tree.h: many further little changes
  for OOM problems.  Now seems to be getting closer to "ok".
* testOOM.c: added code to intercept more errors, found more
  problems with library. Changed method of flagging / counting
  errors intercepted.
  • Loading branch information
William M. Brack committed Jul 31, 2004
1 parent ac996a1 commit a3215c7
Show file tree
Hide file tree
Showing 11 changed files with 184 additions and 83 deletions.
9 changes: 9 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
Sat Jul 31 09:12:44 PDT 2004 William Brack <wbrack@mmm.com.hk>

* SAX2.c, encoding.c, error.c, parser.c, tree.c, uri.c, xmlIO.c,
xmlreader.c, include/libxml/tree.h: many further little changes
for OOM problems. Now seems to be getting closer to "ok".
* testOOM.c: added code to intercept more errors, found more
problems with library. Changed method of flagging / counting
errors intercepted.

Fri Jul 30 13:57:55 CEST 2004 Daniel Veillard <daniel@veillard.com>

* tree.c: applied a couple of patch one from Oliver Stoeneberg
Expand Down
7 changes: 5 additions & 2 deletions SAX2.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
* @msg: a string to accompany the error message
*/
static void
xmlSAX2ErrMemory(xmlParserCtxtPtr ctxt, char *msg) {
xmlSAX2ErrMemory(xmlParserCtxtPtr ctxt, const char *msg) {
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
ctxt->sax->error(ctxt->userData, "%s: out of memory\n", msg);
ctxt->errNo = XML_ERR_NO_MEMORY;
Expand Down Expand Up @@ -858,7 +858,7 @@ xmlSAX2StartDocument(void *ctx)
(ctxt->input != NULL) && (ctxt->input->filename != NULL)) {
ctxt->myDoc->URL = xmlCanonicPath((const xmlChar *) ctxt->input->filename);
if (ctxt->myDoc->URL == NULL)
ctxt->myDoc->URL = xmlStrdup((const xmlChar *) ctxt->input->filename);
xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument");
}
}

Expand Down Expand Up @@ -2268,6 +2268,9 @@ xmlSAX2Characters(void *ctx, const xmlChar *ch, int len)
lastChild->doc = ctxt->node->doc;
ctxt->nodelen = len;
ctxt->nodemem = len + 1;
} else {
xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters");
return;
}
} else {
int coalesceText = (lastChild != NULL) &&
Expand Down
1 change: 1 addition & 0 deletions encoding.c
Original file line number Diff line number Diff line change
Expand Up @@ -1263,6 +1263,7 @@ xmlNewCharEncodingHandler(const char *name,
handler = (xmlCharEncodingHandlerPtr)
xmlMalloc(sizeof(xmlCharEncodingHandler));
if (handler == NULL) {
xmlFree(up);
xmlGenericError(xmlGenericErrorContext,
"xmlNewCharEncodingHandler : out of memory !\n");
return(NULL);
Expand Down
37 changes: 16 additions & 21 deletions error.c
Original file line number Diff line number Diff line change
Expand Up @@ -900,8 +900,17 @@ xmlCtxtResetLastError(void *ctx)
*/
int
xmlCopyError(xmlErrorPtr from, xmlErrorPtr to) {
char *message, *file, *str1, *str2, *str3;

if ((from == NULL) || (to == NULL))
return(-1);

message = (char *) xmlStrdup((xmlChar *) from->message);
file = (char *) xmlStrdup ((xmlChar *) from->file);
str1 = (char *) xmlStrdup ((xmlChar *) from->str1);
str2 = (char *) xmlStrdup ((xmlChar *) from->str2);
str3 = (char *) xmlStrdup ((xmlChar *) from->str3);

if (to->message != NULL)
xmlFree(to->message);
if (to->file != NULL)
Expand All @@ -921,26 +930,12 @@ xmlCopyError(xmlErrorPtr from, xmlErrorPtr to) {
to->int2 = from->int2;
to->node = from->node;
to->ctxt = from->ctxt;
if (from->message != NULL)
to->message = (char *) xmlStrdup((xmlChar *) from->message);
else
to->message = NULL;
if (from->file != NULL)
to->file = (char *) xmlStrdup((xmlChar *) from->file);
else
to->file = NULL;
if (from->str1 != NULL)
to->str1 = (char *) xmlStrdup((xmlChar *) from->str1);
else
to->str1 = NULL;
if (from->str2 != NULL)
to->str2 = (char *) xmlStrdup((xmlChar *) from->str2);
else
to->str2 = NULL;
if (from->str3 != NULL)
to->str3 = (char *) xmlStrdup((xmlChar *) from->str3);
else
to->str3 = NULL;
return(0);
to->message = message;
to->file = file;
to->str1 = str1;
to->str2 = str2;
to->str3 = str3;

return 0;
}

8 changes: 4 additions & 4 deletions include/libxml/tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -585,18 +585,18 @@ XMLPUBFUN void XMLCALL
XMLPUBFUN int XMLCALL
xmlBufferDump (FILE *file,
xmlBufferPtr buf);
XMLPUBFUN void XMLCALL
XMLPUBFUN int XMLCALL
xmlBufferAdd (xmlBufferPtr buf,
const xmlChar *str,
int len);
XMLPUBFUN void XMLCALL
XMLPUBFUN int XMLCALL
xmlBufferAddHead (xmlBufferPtr buf,
const xmlChar *str,
int len);
XMLPUBFUN void XMLCALL
XMLPUBFUN int XMLCALL
xmlBufferCat (xmlBufferPtr buf,
const xmlChar *str);
XMLPUBFUN void XMLCALL
XMLPUBFUN int XMLCALL
xmlBufferCCat (xmlBufferPtr buf,
const char *str);
XMLPUBFUN int XMLCALL
Expand Down
27 changes: 23 additions & 4 deletions parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -3474,13 +3474,16 @@ xmlParseComment(xmlParserCtxtPtr ctxt) {
xmlFatalErr(ctxt, XML_ERR_HYPHEN_IN_COMMENT, NULL);
}
if (len + 5 >= size) {
xmlChar *new_buf;
size *= 2;
buf = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar));
if (buf == NULL) {
new_buf = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar));
if (new_buf == NULL) {
xmlFree (buf);
xmlErrMemory(ctxt, NULL);
ctxt->instate = state;
return;
}
buf = new_buf;
}
COPY_BUF(ql,buf,len,q);
q = r;
Expand Down Expand Up @@ -9079,6 +9082,10 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) {
ctxt->sax->setDocumentLocator(ctxt->userData,
&xmlDefaultSAXLocator);
ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION);
if (ctxt->version == NULL) {
xmlErrMemory(ctxt, NULL);
break;
}
if ((ctxt->sax) && (ctxt->sax->startDocument) &&
(!ctxt->disableSAX))
ctxt->sax->startDocument(ctxt->userData);
Expand Down Expand Up @@ -9737,8 +9744,14 @@ xmlParseChunk(xmlParserCtxtPtr ctxt, const char *chunk, int size,
(ctxt->input->buf != NULL) && (ctxt->instate != XML_PARSER_EOF)) {
int base = ctxt->input->base - ctxt->input->buf->buffer->content;
int cur = ctxt->input->cur - ctxt->input->base;
int res;

xmlParserInputBufferPush(ctxt->input->buf, size, chunk);
res =xmlParserInputBufferPush(ctxt->input->buf, size, chunk);
if (res < 0) {
ctxt->errNo = XML_PARSER_EOF;
ctxt->disableSAX = 1;
return (XML_PARSER_EOF);
}
ctxt->input->base = ctxt->input->buf->buffer->content + base;
ctxt->input->cur = ctxt->input->base + cur;
ctxt->input->end =
Expand Down Expand Up @@ -9897,9 +9910,15 @@ xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, void *user_data,

if (filename == NULL)
inputStream->filename = NULL;
else
else {
inputStream->filename = (char *)
xmlCanonicPath((const xmlChar *) filename);
if (inputStream->filename == NULL) {
xmlFreeParserCtxt(ctxt);
xmlFreeParserInputBuffer(buf);
return(NULL);
}
}
inputStream->buf = buf;
inputStream->base = inputStream->buf->buffer->content;
inputStream->cur = inputStream->buf->buffer->content;
Expand Down
28 changes: 16 additions & 12 deletions testOOM.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@

#define EXIT_OOM 2

int error = FALSE;
int errcount = 0;
int noent = 0;
int count = 0;
int valid = 0;
Expand Down Expand Up @@ -129,7 +131,7 @@ static void buffer_add_char (struct buffer *b, char c)
static void buffer_add_string (struct buffer *b, const char *s)
{
size_t size = strlen(s) + 1;
int ix;
unsigned int ix;
for (ix=0; ix<size-1; ix++) {
if (s[ix] < 0x20)
printf ("binary data [0x%02x]?\n", (unsigned char)s[ix]);
Expand Down Expand Up @@ -193,22 +195,22 @@ static int processNode (xmlTextReaderPtr reader, void *data)
buffer_add_string (buff, elementNames[type]);

if (type == 1) {
s = xmlTextReaderConstName (reader);
s = (const char *)xmlTextReaderConstName (reader);
if (s == NULL) return FALSE;
buffer_add_string (buff, s);
while ((ret = xmlTextReaderMoveToNextAttribute (reader)) == 1) {
s = xmlTextReaderConstName (reader);
s = (const char *)xmlTextReaderConstName (reader);
if (s == NULL) return FALSE;
buffer_add_string (buff, s);
buffer_add_char (buff, '=');
s = xmlTextReaderConstValue (reader);
s = (const char *)xmlTextReaderConstValue (reader);
if (s == NULL) return FALSE;
buffer_add_string (buff, s);
}
if (ret == -1) return FALSE;
}
else if (type == 3) {
s = xmlTextReaderConstValue (reader);
s = (const char *)xmlTextReaderConstValue (reader);
if (s == NULL) return FALSE;
buffer_add_string (buff, s);
}
Expand All @@ -224,14 +226,15 @@ struct file_params {
};

static void
error_func (void *data, xmlErrorPtr err)
error_func (void *data ATTRIBUTE_UNUSED, xmlErrorPtr err)
{
int *e = data;

errcount++;
if (err->level == XML_ERR_ERROR ||
err->level == XML_ERR_FATAL)
*e = TRUE;
error = TRUE;
if (showErrs) {
printf("line %d: %s\n", err->line, err->message);
printf("%3d line %d: %s\n", error, err->line, err->message);
}
}

Expand All @@ -241,7 +244,7 @@ check_load_file_memory_func (void *data)
struct file_params *p = data;
struct buffer *b;
xmlTextReaderPtr reader;
int ret, status, first_run, error;
int ret, status, first_run;

if (count) {
elem = 0;
Expand All @@ -261,7 +264,8 @@ check_load_file_memory_func (void *data)
if (reader == NULL)
goto out;

xmlTextReaderSetStructuredErrorHandler (reader, error_func, &error);
xmlTextReaderSetStructuredErrorHandler (reader, error_func, NULL);
xmlSetStructuredErrorFunc(NULL, error_func);

if (valid) {
if (xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1) == -1)
Expand All @@ -279,7 +283,7 @@ check_load_file_memory_func (void *data)
goto out;

if (error) {
fprintf (stdout, "error handler was called but parse completed successfully\n");
fprintf (stdout, "error handler was called but parse completed successfully (last error #%d)\n", errcount);
return FALSE;
}

Expand Down
Loading

0 comments on commit a3215c7

Please sign in to comment.