git://git.exim.org
/
exim.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
a4dc33a
)
Fix bug in readconf in diagnosing overflowing ints in 64-bit systems.
author
Philip Hazel
<ph10@hermes.cam.ac.uk>
Wed, 4 Jul 2007 11:03:46 +0000
(11:03 +0000)
committer
Philip Hazel
<ph10@hermes.cam.ac.uk>
Wed, 4 Jul 2007 11:03:46 +0000
(11:03 +0000)
src/src/readconf.c
patch
|
blob
|
history
diff --git
a/src/src/readconf.c
b/src/src/readconf.c
index 660a5bf8a6478250bef21fe0e4535d681afd1341..6021d74fe956a5fafdfa853df54c4cd60aed0d90 100644
(file)
--- a/
src/src/readconf.c
+++ b/
src/src/readconf.c
@@
-1,4
+1,4
@@
-/* $Cambridge: exim/src/src/readconf.c,v 1.3
0 2007/06/27 11:01:52
ph10 Exp $ */
+/* $Cambridge: exim/src/src/readconf.c,v 1.3
1 2007/07/04 11:03:46
ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
/*************************************************
* Exim - an Internet mail transport agent *
@@
-1830,8
+1830,10
@@
switch (type)
case opt_int:
{
uschar *endptr;
case opt_int:
{
uschar *endptr;
+ long int lvalue;
+
errno = 0;
errno = 0;
- value = strtol(CS s, CSS &endptr, intbase);
+
l
value = strtol(CS s, CSS &endptr, intbase);
if (endptr == s)
log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "%sinteger expected for %s",
if (endptr == s)
log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "%sinteger expected for %s",
@@
-1841,25
+1843,28
@@
switch (type)
{
if (tolower(*endptr) == 'k')
{
{
if (tolower(*endptr) == 'k')
{
- if (
value > INT_MAX/1024 ||
value < INT_MIN/1024) errno = ERANGE;
- else value *= 1024;
+ if (
lvalue > INT_MAX/1024 || l
value < INT_MIN/1024) errno = ERANGE;
+ else
l
value *= 1024;
endptr++;
}
else if (tolower(*endptr) == 'm')
{
endptr++;
}
else if (tolower(*endptr) == 'm')
{
- if (
value > INT_MAX/(1024*1024) ||
value < INT_MIN/(1024*1024))
+ if (
lvalue > INT_MAX/(1024*1024) || l
value < INT_MIN/(1024*1024))
errno = ERANGE;
errno = ERANGE;
- else value *= 1024*1024;
+ else
l
value *= 1024*1024;
endptr++;
}
}
endptr++;
}
}
- if (errno == ERANGE) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
- "absolute value of integer \"%s\" is too large (overflow)", s);
+ if (errno == ERANGE || lvalue > INT_MAX || lvalue < INT_MIN)
+ log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
+ "absolute value of integer \"%s\" is too large (overflow)", s);
while (isspace(*endptr)) endptr++;
if (*endptr != 0)
extra_chars_error(endptr, inttype, US"integer value for ", name);
while (isspace(*endptr)) endptr++;
if (*endptr != 0)
extra_chars_error(endptr, inttype, US"integer value for ", name);
+
+ value = (int)lvalue;
}
if (data_block == NULL)
}
if (data_block == NULL)