more error case handling.
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6892 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
5fcd7992f7
commit
ddd0b667f7
|
@ -936,7 +936,9 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_parse_fd(int fd)
|
||||||
madvise(m, root->len = l, MADV_NORMAL); // put it back to normal
|
madvise(m, root->len = l, MADV_NORMAL); // put it back to normal
|
||||||
} else { // mmap failed, read file into memory
|
} else { // mmap failed, read file into memory
|
||||||
#endif // HAVE_MMAP
|
#endif // HAVE_MMAP
|
||||||
l = read(fd, m = malloc(st.st_size), st.st_size);
|
m = malloc(st.st_size);
|
||||||
|
if (!m) return NULL;
|
||||||
|
l = read(fd, m, st.st_size);
|
||||||
root = (switch_xml_root_t) switch_xml_parse_str((char *)m, l);
|
root = (switch_xml_root_t) switch_xml_parse_str((char *)m, l);
|
||||||
root->dynamic = 1; // so we know to free s in switch_xml_free()
|
root->dynamic = 1; // so we know to free s in switch_xml_free()
|
||||||
#ifdef HAVE_MMAP
|
#ifdef HAVE_MMAP
|
||||||
|
@ -1011,7 +1013,7 @@ static int preprocess_glob(const char *cwd, const char *pattern, int write_fd, i
|
||||||
|
|
||||||
for (int n = 0; n < glob.FileCount(); ++n) {
|
for (int n = 0; n < glob.FileCount(); ++n) {
|
||||||
dir_path = strdup(glob.File(n));
|
dir_path = strdup(glob.File(n));
|
||||||
assert(dir_path);
|
switch_assert(dir_path);
|
||||||
if ((e = strrchr(dir_path, *SWITCH_PATH_SEPARATOR))) {
|
if ((e = strrchr(dir_path, *SWITCH_PATH_SEPARATOR))) {
|
||||||
*e = '\0';
|
*e = '\0';
|
||||||
}
|
}
|
||||||
|
@ -1218,7 +1220,9 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_parse_file_simple(const char *file)
|
||||||
|
|
||||||
if ((fd = open(file, O_RDONLY, 0)) > -1) {
|
if ((fd = open(file, O_RDONLY, 0)) > -1) {
|
||||||
fstat(fd, &st);
|
fstat(fd, &st);
|
||||||
l = read(fd, m = malloc(st.st_size), st.st_size);
|
m = malloc(st.st_size);
|
||||||
|
switch_assert(m);
|
||||||
|
l = read(fd, m, st.st_size);
|
||||||
root = (switch_xml_root_t) switch_xml_parse_str((char *)m, l);
|
root = (switch_xml_root_t) switch_xml_parse_str((char *)m, l);
|
||||||
root->dynamic = 1;
|
root->dynamic = 1;
|
||||||
close(fd);
|
close(fd);
|
||||||
|
@ -1532,8 +1536,11 @@ static char *switch_xml_ampencode(const char *s, switch_size_t len, char **dst,
|
||||||
}
|
}
|
||||||
|
|
||||||
while (s != e) {
|
while (s != e) {
|
||||||
while (*dlen + 10 > *max)
|
while (*dlen + 10 > *max) {
|
||||||
*dst = (char *)realloc(*dst, *max += SWITCH_XML_BUFSIZE);
|
char *tmp = (char *)realloc(*dst, *max += SWITCH_XML_BUFSIZE);
|
||||||
|
if (!tmp) return *dst;
|
||||||
|
*dst = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
if (immune) {
|
if (immune) {
|
||||||
if (*s == '\0') {
|
if (*s == '\0') {
|
||||||
|
@ -1592,8 +1599,11 @@ static char *switch_xml_toxml_r(switch_xml_t xml, char **s, switch_size_t *len,
|
||||||
// parent character content up to this tag
|
// parent character content up to this tag
|
||||||
*s = switch_xml_ampencode(txt + start, xml->off - start, s, len, max, 0);
|
*s = switch_xml_ampencode(txt + start, xml->off - start, s, len, max, 0);
|
||||||
|
|
||||||
while (*len + strlen(xml->name) + 5 + (strlen(XML_INDENT) * (*count)) + 1 > *max) // reallocate s
|
while (*len + strlen(xml->name) + 5 + (strlen(XML_INDENT) * (*count)) + 1 > *max) { // reallocate s
|
||||||
*s = (char *)realloc(*s, *max += SWITCH_XML_BUFSIZE);
|
char *tmp = (char *)realloc(*s, *max += SWITCH_XML_BUFSIZE);
|
||||||
|
if (!tmp) return *s;
|
||||||
|
*s = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
if (*(*s + (*len) - 1) == '>') {
|
if (*(*s + (*len) - 1) == '>') {
|
||||||
*len += sprintf(*s + *len, "\n"); // indent
|
*len += sprintf(*s + *len, "\n"); // indent
|
||||||
|
@ -1606,8 +1616,11 @@ static char *switch_xml_toxml_r(switch_xml_t xml, char **s, switch_size_t *len,
|
||||||
for (i = 0; xml->attr[i]; i += 2) { // tag attributes
|
for (i = 0; xml->attr[i]; i += 2) { // tag attributes
|
||||||
if (switch_xml_attr(xml, xml->attr[i]) != xml->attr[i + 1])
|
if (switch_xml_attr(xml, xml->attr[i]) != xml->attr[i + 1])
|
||||||
continue;
|
continue;
|
||||||
while (*len + strlen(xml->attr[i]) + 7 + (strlen(XML_INDENT) * (*count)) > *max) // reallocate s
|
while (*len + strlen(xml->attr[i]) + 7 + (strlen(XML_INDENT) * (*count)) > *max) { // reallocate s
|
||||||
*s = (char *)realloc(*s, *max += SWITCH_XML_BUFSIZE);
|
char *tmp = (char *)realloc(*s, *max += SWITCH_XML_BUFSIZE);
|
||||||
|
if (!tmp) return *s;
|
||||||
|
*s = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
*len += sprintf(*s + *len, " %s=\"", xml->attr[i]);
|
*len += sprintf(*s + *len, " %s=\"", xml->attr[i]);
|
||||||
switch_xml_ampencode(xml->attr[i + 1], 0, s, len, max, 1);
|
switch_xml_ampencode(xml->attr[i + 1], 0, s, len, max, 1);
|
||||||
|
@ -1618,8 +1631,11 @@ static char *switch_xml_toxml_r(switch_xml_t xml, char **s, switch_size_t *len,
|
||||||
for (j = 1; attr[i] && attr[i][j]; j += 3) { // default attributes
|
for (j = 1; attr[i] && attr[i][j]; j += 3) { // default attributes
|
||||||
if (!attr[i][j + 1] || switch_xml_attr(xml, attr[i][j]) != attr[i][j + 1])
|
if (!attr[i][j + 1] || switch_xml_attr(xml, attr[i][j]) != attr[i][j + 1])
|
||||||
continue; // skip duplicates and non-values
|
continue; // skip duplicates and non-values
|
||||||
while (*len + strlen(attr[i][j]) + 8 + (strlen(XML_INDENT) * (*count)) > *max) // reallocate s
|
while (*len + strlen(attr[i][j]) + 8 + (strlen(XML_INDENT) * (*count)) > *max) { // reallocate s
|
||||||
*s = (char *)realloc(*s, *max += SWITCH_XML_BUFSIZE);
|
char *tmp = (char *)realloc(*s, *max += SWITCH_XML_BUFSIZE);
|
||||||
|
if (!tmp) return *s;
|
||||||
|
*s = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
*len += sprintf(*s + *len, " %s=\"", attr[i][j]);
|
*len += sprintf(*s + *len, " %s=\"", attr[i][j]);
|
||||||
switch_xml_ampencode(attr[i][j + 1], 0, s, len, max, 1);
|
switch_xml_ampencode(attr[i][j + 1], 0, s, len, max, 1);
|
||||||
|
@ -1636,9 +1652,11 @@ static char *switch_xml_toxml_r(switch_xml_t xml, char **s, switch_size_t *len,
|
||||||
*s = switch_xml_ampencode(xml->txt, 0, s, len, max, 0); //data
|
*s = switch_xml_ampencode(xml->txt, 0, s, len, max, 0); //data
|
||||||
}
|
}
|
||||||
|
|
||||||
while (*len + strlen(xml->name) + 5 + (strlen(XML_INDENT) * (*count)) > *max) // reallocate s
|
while (*len + strlen(xml->name) + 5 + (strlen(XML_INDENT) * (*count)) > *max) { // reallocate s
|
||||||
*s = (char *)realloc(*s, *max += SWITCH_XML_BUFSIZE);
|
char *tmp = (char *)realloc(*s, *max += SWITCH_XML_BUFSIZE);
|
||||||
|
if (!tmp) return *s;
|
||||||
|
*s = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
if (xml->child || xml->txt) {
|
if (xml->child || xml->txt) {
|
||||||
if (*(*s + (*len) - 1) == '\n') {
|
if (*(*s + (*len) - 1) == '\n') {
|
||||||
|
@ -1927,9 +1945,13 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_set_attr(switch_xml_t xml, const char *n
|
||||||
return xml; // nothing to do
|
return xml; // nothing to do
|
||||||
if (xml->attr == SWITCH_XML_NIL) { // first attribute
|
if (xml->attr == SWITCH_XML_NIL) { // first attribute
|
||||||
xml->attr = (char **)malloc(4 * sizeof(char *));
|
xml->attr = (char **)malloc(4 * sizeof(char *));
|
||||||
|
if (!xml->attr) return NULL;
|
||||||
xml->attr[1] = strdup(""); // empty list of malloced names/vals
|
xml->attr[1] = strdup(""); // empty list of malloced names/vals
|
||||||
} else
|
} else {
|
||||||
xml->attr = (char **)realloc(xml->attr, (l + 4) * sizeof(char *));
|
char **tmp = (char **)realloc(xml->attr, (l + 4) * sizeof(char *));
|
||||||
|
if (!tmp) return xml;
|
||||||
|
xml->attr = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
xml->attr[l] = (char *) name; // set attribute name
|
xml->attr[l] = (char *) name; // set attribute name
|
||||||
xml->attr[l + 2] = NULL; // null terminate attribute list
|
xml->attr[l + 2] = NULL; // null terminate attribute list
|
||||||
|
@ -1951,10 +1973,13 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_set_attr(switch_xml_t xml, const char *n
|
||||||
if (value)
|
if (value)
|
||||||
xml->attr[l + 1] = (char *) value; // set attribute value
|
xml->attr[l + 1] = (char *) value; // set attribute value
|
||||||
else { // remove attribute
|
else { // remove attribute
|
||||||
|
char **tmp;
|
||||||
if (xml->attr[c + 1][l / 2] & SWITCH_XML_NAMEM)
|
if (xml->attr[c + 1][l / 2] & SWITCH_XML_NAMEM)
|
||||||
free(xml->attr[l]);
|
free(xml->attr[l]);
|
||||||
memmove(xml->attr + l, xml->attr + l + 2, (c - l + 2) * sizeof(char *));
|
memmove(xml->attr + l, xml->attr + l + 2, (c - l + 2) * sizeof(char *));
|
||||||
xml->attr = (char **)realloc(xml->attr, (c + 2) * sizeof(char *));
|
tmp =(char **)realloc(xml->attr, (c + 2) * sizeof(char *));
|
||||||
|
if (!tmp) return xml;
|
||||||
|
xml->attr = tmp;
|
||||||
memmove(xml->attr[c + 1] + (l / 2), xml->attr[c + 1] + (l / 2) + 1, (c / 2) - (l / 2)); // fix list of which name/vals are malloced
|
memmove(xml->attr[c + 1] + (l / 2), xml->attr[c + 1] + (l / 2) + 1, (c / 2) - (l / 2)); // fix list of which name/vals are malloced
|
||||||
}
|
}
|
||||||
xml->flags &= ~SWITCH_XML_DUP; // clear strdup() flag
|
xml->flags &= ~SWITCH_XML_DUP; // clear strdup() flag
|
||||||
|
|
Loading…
Reference in New Issue