Hi,
there is an inconsistency between 64-bit and 32-bit systems when a
large integer which doesn't fit in int is specified in the config. On
32-bit the value is clamped to INT_MAX, because long is the same width
as int. This leads to strange situations when the same configuration
works on 32-bit, but fails on 64-bit, as I have seen in a recent
Fedora bug report with too large mailbox_size_limit.
So I'm wondering is this worth checking? The value could be always
clamped or it could be a fatal error if it's out of range.
Something like this (and similarly for the other data types):
--- mail_conf_int.c.orig
+++ mail_conf_int.c
@@ -80,6 +80,7 @@
#include <sys_defs.h>
#include <stdlib.h>
#include <stdio.h> /* sscanf() */
+#include <errno.h>
/* Utility library. */
@@ -97,10 +98,14 @@
static int convert_mail_conf_int(const char *name, int *intval)
{
const char *strval;
- char junk;
+ char *end;
+ long longval;
if ((strval = mail_conf_lookup_eval(name)) != 0) {
- if (sscanf(strval, "%d%c", intval, &junk) != 1)
+ errno = 0;
+ *intval = longval = strtol(strval, &end, 10);
+ if (*strval == '\0' || *end != '\0' || errno == ERANGE ||
+ longval != *intval)
msg_fatal("bad numerical configuration: %s = %s", name, strval);
return (1);
}
Thanks,
--
Miroslav Lichvar