22 Apr
2006
22 Apr
'06
2:09 a.m.
Timo,
In src/plugins/quota/quota-maildir.c, in the maildirsize_read() function, if the maildirsize file is greater that 5120 bytes, this code breaks because the while loop executes multiple times, incrementing size to a value larger than 5120, and then size is later used to referece the buf array out of bounds. To fix it you could add a break statement after "size+= ret;" so that the while loop is always only executed once:
char buf[5120+1];
...
size = 0;
while ((ret = read(fd, buf, sizeof(buf)-1)) != 0) {
if (ret < 0) {
if (errno == ESTALE)
break;
mail_storage_set_critical(storage, "read(%s) failed: %m",
path);
}
size += ret;
}
if (ret < 0 || size == sizeof(buf)-1) {
/* error / recalculation needed. */
(void)close(fd);
t_pop();
return ret < 0 ? -1 : 0;
}
/* file is smaller than 5120 bytes, which means we can use it */
root->total_bytes = root->total_count = 0;
/* skip the last line if there's no LF at the end */
while (size > 0 && buf[size-1] != '\n') size--;
buf[size] = '\0';