mirror of
https://gitea.psi.ch/ELOG/elog.git
synced 2026-09-08 17:13:56 +00:00
Use heap memory in propagate_attrib to prevent stack overflows.
This commit is contained in:
parent
15ecf9fe52
commit
a738232fdb
31
src/elogd.c
31
src/elogd.c
@ -22171,33 +22171,44 @@ 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 propagate_attrib(LOGBOOK * lbs, int message_id, char attrib[MAX_N_ATTR][NAME_LENGTH])
|
||||||
{
|
{
|
||||||
int n, i, j, status;
|
int n, i, j, status;
|
||||||
char str[NAME_LENGTH], att_file[MAX_ATTACHMENTS][256], attr[MAX_N_ATTR][NAME_LENGTH],
|
char str[NAME_LENGTH], att_file[MAX_ATTACHMENTS][256], *attr, *list, reply_to[MAX_REPLY_TO * 10];
|
||||||
list[MAX_N_ATTR][NAME_LENGTH], 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,
|
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);
|
NULL, NULL, NULL, reply_to, att_file, NULL, NULL);
|
||||||
if (status != EL_SUCCESS)
|
if (status != EL_SUCCESS) {
|
||||||
|
xfree(list);
|
||||||
|
xfree(attr);
|
||||||
return status;
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
getcfg(lbs->name, "Propagate attributes", str, sizeof(str));
|
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 (i = 0; i < n; i++) {
|
||||||
for (j = 0; j < lbs->n_attr; j++)
|
for (j = 0; j < lbs->n_attr; j++)
|
||||||
if (stricmp(attr_list[j], list[i]) == 0) {
|
if (stricmp(attr_list[j], list+i*NAME_LENGTH) == 0) {
|
||||||
strlcpy(attr[j], attrib[j], NAME_LENGTH);
|
strlcpy(attr+j*NAME_LENGTH, attrib[j], NAME_LENGTH);
|
||||||
break;
|
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);
|
"<keep>", "<keep>", "<keep>", att_file, TRUE, NULL);
|
||||||
if (message_id < 0)
|
if (message_id < 0) {
|
||||||
|
xfree(list);
|
||||||
|
xfree(attr);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// go through all replies of this entry
|
// 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++)
|
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;
|
return EL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user