Use heap memory in propagate_attrib to prevent stack overflows.

This commit is contained in:
2014-01-13 09:25:57 +01:00
parent 15ecf9fe52
commit a738232fdb
+21 -10
View File
@@ -22171,34 +22171,45 @@ int set_attributes(LOGBOOK * lbs, char attributes[][NAME_LENGTH], int n)
int propagate_attrib(LOGBOOK * lbs, int message_id, char attrib[MAX_N_ATTR][NAME_LENGTH])
{
int n, i, j, status;
char str[NAME_LENGTH], att_file[MAX_ATTACHMENTS][256], attr[MAX_N_ATTR][NAME_LENGTH],
list[MAX_N_ATTR][NAME_LENGTH], reply_to[MAX_REPLY_TO * 10];
char str[NAME_LENGTH], att_file[MAX_ATTACHMENTS][256], *attr, *list, reply_to[MAX_REPLY_TO * 10];
list = (char *)xmalloc(MAX_N_ATTR*NAME_LENGTH);
attr = (char *)xmalloc(MAX_N_ATTR*NAME_LENGTH);
status = el_retrieve(lbs, message_id, NULL, attr_list, (char (*)[NAME_LENGTH]) attr, lbs->n_attr,
NULL, NULL, NULL, reply_to, att_file, NULL, NULL);
if (status != EL_SUCCESS)
if (status != EL_SUCCESS) {
xfree(list);
xfree(attr);
return status;
}
getcfg(lbs->name, "Propagate attributes", str, sizeof(str));
n = strbreak(str, list, MAX_N_ATTR, ",", FALSE);
n = strbreak(str, (char (*)[1500])list, MAX_N_ATTR, ",", FALSE);
for (i = 0; i < n; i++) {
for (j = 0; j < lbs->n_attr; j++)
if (stricmp(attr_list[j], list[i]) == 0) {
strlcpy(attr[j], attrib[j], NAME_LENGTH);
if (stricmp(attr_list[j], list+i*NAME_LENGTH) == 0) {
strlcpy(attr+j*NAME_LENGTH, attrib[j], NAME_LENGTH);
break;
}
}
message_id = el_submit(lbs, message_id, TRUE, "<keep>", attr_list, attr, lbs->n_attr, "<keep>",
message_id = el_submit(lbs, message_id, TRUE, "<keep>", attr_list, (char (*)[1500])attr, lbs->n_attr, "<keep>",
"<keep>", "<keep>", "<keep>", att_file, TRUE, NULL);
if (message_id < 0)
if (message_id < 0) {
xfree(list);
xfree(attr);
return 0;
}
// go through all replies of this entry
n = strbreak(reply_to, list, MAX_N_ATTR, ",", FALSE);
n = strbreak(reply_to, (char (*)[1500])list, MAX_N_ATTR, ",", FALSE);
for (i = 0; i < n; i++)
propagate_attrib(lbs, atoi(list[i]), attrib);
propagate_attrib(lbs, atoi(list+i*NAME_LENGTH), attrib);
xfree(list);
xfree(attr);
return EL_SUCCESS;
}