more memory related code cleanups. Daniel
* HTMLparser.c parser.c relaxng.c xmlschemas.c: more memory related
code cleanups.
Daniel
diff --git a/ChangeLog b/ChangeLog
index dd08328..78bcb04 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Sep 23 15:14:12 CEST 2004 Daniel Veillard <daniel@veillard.com>
+
+ * HTMLparser.c parser.c relaxng.c xmlschemas.c: more memory related
+ code cleanups.
+
Thu Sep 23 01:04:30 CEST 2004 Daniel Veillard <daniel@veillard.com>
* parser.c: fixed a bunch of errors when realloc failed.
diff --git a/HTMLparser.c b/HTMLparser.c
index 5a03333..10f8516 100644
--- a/HTMLparser.c
+++ b/HTMLparser.c
@@ -1703,12 +1703,15 @@
* Macro used to grow the current buffer.
*/
#define growBuffer(buffer) { \
+ xmlChar *tmp; \
buffer##_size *= 2; \
- buffer = (xmlChar *) xmlRealloc(buffer, buffer##_size * sizeof(xmlChar)); \
- if (buffer == NULL) { \
+ tmp = (xmlChar *) xmlRealloc(buffer, buffer##_size * sizeof(xmlChar)); \
+ if (tmp == NULL) { \
htmlErrMemory(ctxt, "growing buffer\n"); \
+ xmlFree(buffer); \
return(NULL); \
} \
+ buffer = tmp; \
}
/**
@@ -2849,13 +2852,17 @@
((cur != '>') ||
(r != '-') || (q != '-'))) {
if (len + 5 >= size) {
+ xmlChar *tmp;
+
size *= 2;
- buf = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar));
- if (buf == NULL) {
+ tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar));
+ if (tmp == NULL) {
+ xmlFree(buf);
htmlErrMemory(ctxt, "growing buffer failed\n");
ctxt->instate = state;
return;
}
+ buf = tmp;
}
COPY_BUF(ql,buf,len,q);
q = r;
diff --git a/parser.c b/parser.c
index 5b6b9ae..998a97a 100644
--- a/parser.c
+++ b/parser.c
@@ -645,8 +645,8 @@
}
/*
- * plit the element name into prefix:localname , the string found
- * are within the DTD and hen not associated to namespace names.
+ * split the element name into prefix:localname , the string found
+ * are within the DTD and then not associated to namespace names.
*/
name = xmlSplitQName3(fullname, &len);
if (name == NULL) {
@@ -663,17 +663,20 @@
defaults = xmlHashLookup2(ctxt->attsDefault, name, prefix);
if (defaults == NULL) {
defaults = (xmlDefAttrsPtr) xmlMalloc(sizeof(xmlDefAttrs) +
- 12 * sizeof(const xmlChar *));
+ (4 * 4) * sizeof(const xmlChar *));
if (defaults == NULL)
goto mem_error;
- defaults->maxAttrs = 4;
defaults->nbAttrs = 0;
+ defaults->maxAttrs = 4;
xmlHashUpdateEntry2(ctxt->attsDefault, name, prefix, defaults, NULL);
} else if (defaults->nbAttrs >= defaults->maxAttrs) {
- defaults = (xmlDefAttrsPtr) xmlRealloc(defaults, sizeof(xmlDefAttrs) +
+ xmlDefAttrsPtr temp;
+
+ temp = (xmlDefAttrsPtr) xmlRealloc(defaults, sizeof(xmlDefAttrs) +
(2 * defaults->maxAttrs * 4) * sizeof(const xmlChar *));
- if (defaults == NULL)
+ if (temp == NULL)
goto mem_error;
+ defaults = temp;
defaults->maxAttrs *= 2;
xmlHashUpdateEntry2(ctxt->attsDefault, name, prefix, defaults, NULL);
}
diff --git a/relaxng.c b/relaxng.c
index 29cdb19..8eb81ec 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -3964,14 +3964,17 @@
return (NULL);
}
} else if (max <= len) {
+ xmlRelaxNGDefinePtr *temp;
+
max *= 2;
- ret =
- xmlRealloc(ret,
+ temp = xmlRealloc(ret,
(max + 1) * sizeof(xmlRelaxNGDefinePtr));
- if (ret == NULL) {
+ if (temp == NULL) {
xmlRngPErrMemory(ctxt, "getting element list\n");
+ xmlFree(ret);
return (NULL);
}
+ ret = temp;
}
ret[len++] = cur;
ret[len] = NULL;
diff --git a/xmlschemas.c b/xmlschemas.c
index 000a0dd..2592dc3 100644
--- a/xmlschemas.c
+++ b/xmlschemas.c
@@ -13103,6 +13103,7 @@
xmlSchemaVErrMemory(ctxt, "registering attributes", NULL);
return (-1);
}
+ memset(tmp, 0, sizeof(xmlSchemaAttrState));
tmp->attr = attrs;
tmp->state = XML_SCHEMAS_ATTR_UNKNOWN;
tmp->next = NULL;