[Freeswitch-svn] [commit] r6889 - freeswitch/trunk/src

Freeswitch SVN mikej at freeswitch.org
Tue Dec 18 18:45:06 EST 2007


Author: mikej
Date: Tue Dec 18 18:45:06 2007
New Revision: 6889

Modified:
   freeswitch/trunk/src/switch_xml.cpp

Log:
more error case handling.

Modified: freeswitch/trunk/src/switch_xml.cpp
==============================================================================
--- freeswitch/trunk/src/switch_xml.cpp	(original)
+++ freeswitch/trunk/src/switch_xml.cpp	Tue Dec 18 18:45:06 2007
@@ -489,6 +489,8 @@
 {
 	int i = 0, j = 1;
 	char *target = s;
+	char **sstmp;
+	char *stmp;
 
 	s[len] = '\0';				// null terminate instruction
 	if (*(s += strcspn(s, SWITCH_XML_WS))) {
@@ -513,7 +515,9 @@
 	while (root->pi[i] && strcmp(target, root->pi[i][0]))
 		i++;					// find target
 	if (!root->pi[i]) {			// new target
-		root->pi = (char ***)realloc(root->pi, sizeof(char **) * (i + 2));
+		char ***ssstmp = (char ***)realloc(root->pi, sizeof(char **) * (i + 2));
+		if (!ssstmp) return;
+		root->pi = ssstmp; 
 		if (!root->pi) return;
 		root->pi[i] = (char **)malloc(sizeof(char *) * 3);
 		if (!root->pi[i]) return;
@@ -524,8 +528,12 @@
 
 	while (root->pi[i][j])
 		j++;					// find end of instruction list for this target
-	root->pi[i] = (char **)realloc(root->pi[i], sizeof(char *) * (j + 3));
-	root->pi[i][j + 2] = (char *)realloc(root->pi[i][j + 1], j + 1);
+	sstmp = (char **)realloc(root->pi[i], sizeof(char *) * (j + 3));
+	if (!sstmp) return;
+	root->pi[i] = sstmp;
+	stmp = (char *)realloc(root->pi[i][j + 1], j + 1);
+	if (!stmp) return;
+	root->pi[i][j + 2] = stmp; 
 	strcpy(root->pi[i][j + 2] + j - 1, (root->xml.name) ? ">" : "<");
 	root->pi[i][j + 1] = NULL;	// null terminate pi list for this target
 	root->pi[i][j] = s;			// set instruction
@@ -536,6 +544,7 @@
 {
 	char q, *c, *t, *n = NULL, *v, **ent, **pe;
 	int i, j;
+	char **sstmp;
 
 	pe = (char **)memcpy(malloc(sizeof(SWITCH_XML_NIL)), SWITCH_XML_NIL, sizeof(SWITCH_XML_NIL));
 	
@@ -557,7 +566,12 @@
 			}
 
 			for (i = 0, ent = (*c == '%') ? pe : root->ent; ent[i]; i++);
-			ent = (char **)realloc(ent, (i + 3) * sizeof(char *));	// space for next ent
+			sstmp = (char **)realloc(ent, (i + 3) * sizeof(char *));	// space for next ent
+			if (!sstmp) {
+				switch_xml_err(root, v, "Allocation Error!");
+				break;
+			}
+			ent = sstmp;
 			if (*c == '%')
 				pe = ent;
 			else
@@ -630,8 +644,14 @@
 				}
 
 				for (j = 1; root->attr[i][j]; j += 3);	// find end of list
-				root->attr[i] = (char **)realloc(root->attr[i], (j + 4) * sizeof(char *));
+				sstmp = (char **)realloc(root->attr[i], (j + 4) * sizeof(char *));
+
+				if (!sstmp) {
+					switch_xml_err(root, t, "Allocation Error!");
+					break;
+				}
 
+				root->attr[i] = sstmp;
 				root->attr[i][j + 3] = NULL;	// null terminate list
 				root->attr[i][j + 2] = c;	// is it cdata?
 				root->attr[i][j + 1] = (v) ? switch_xml_decode(v, root->ent, *c)
@@ -675,8 +695,12 @@
 			c = (((c & 0x3FF) << 10) | (d & 0x3FF)) + 0x10000;
 		}
 
-		while (l + 6 > max)
-			u = (char *)realloc(u, max += SWITCH_XML_BUFSIZE);
+		while (l + 6 > max) {
+			char *tmp;
+			tmp = (char *)realloc(u, max += SWITCH_XML_BUFSIZE);
+			if (!tmp) return NULL;
+			u = tmp;
+		}
 		if (c < 0x80)
 			u[l++] = (char) c;	// US-ASCII subset
 		else {					// multi-byte UTF-8 sequence
@@ -873,8 +897,14 @@
 		return NULL;
 	do {
 		len += (l = fread((s + len), 1, SWITCH_XML_BUFSIZE, fp));
-		if (l == SWITCH_XML_BUFSIZE)
-			s = (char *)realloc(s, len + SWITCH_XML_BUFSIZE);
+		if (l == SWITCH_XML_BUFSIZE) {
+			char *tmp = (char *)realloc(s, len + SWITCH_XML_BUFSIZE);
+			if (!tmp) {
+				free(s);
+				return NULL;
+			}
+			s = tmp;
+		}
 	} while (s && l == SWITCH_XML_BUFSIZE);
 
 	if (!s)



More information about the Freeswitch-svn mailing list