From fa792e2ce96b4d6f9e39e350ec967ccb833277a7 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Fri, 14 Dec 2018 14:03:18 +0000 Subject: [PATCH] Fix parsing of option type Kint (integer, stored in K). Bug 2348 Broken-by: a45431fa71 --- src/src/readconf.c | 13 ++++++------- test/paniclog/0415 | 2 +- test/scripts/0000-Basic/0415 | 2 +- test/stderr/0415 | 2 +- test/stdout/0415 | 2 +- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/src/readconf.c b/src/src/readconf.c index f21ce4d04..44452baa6 100644 --- a/src/src/readconf.c +++ b/src/src/readconf.c @@ -2130,7 +2130,7 @@ switch (type) inttype = US"octal "; /* Integer: a simple(ish) case; allow octal and hex formats, and - suffixes K, M and G. The different types affect output, not input. */ + suffixes K, M, G, and T. The different types affect output, not input. */ case opt_mkint: case opt_int: @@ -2147,7 +2147,7 @@ switch (type) if (errno != ERANGE && *endptr) { - uschar * mp = US"GgMmKk\0"; /* YyZzEePpTtGgMmKk */ + uschar * mp = US"TtGgMmKk\0"; /* YyZzEePpTtGgMmKk */ if ((mp = Ustrchr(mp, *endptr))) { @@ -2182,8 +2182,7 @@ switch (type) *(int *)ol->value = value; break; - /* Integer held in K: again, allow octal and hex formats, and suffixes K, M, - G and T. */ + /* Integer held in K: again, allow formats and suffixes as above. */ case opt_Kint: { @@ -2197,12 +2196,12 @@ switch (type) if (errno != ERANGE && *endptr) { - uschar * mp = US"EePpTtGgMmKk\0"; /* YyZzEePpTtGgMmKk */ + uschar * mp = US"ZzEePpTtGgMmKk\0"; /* YyZzEePpTtGgMmKk */ if ((mp = Ustrchr(mp, *endptr))) { endptr++; - do + while (*(mp += 2)) { if (lvalue > EXIM_ARITH_MAX/1024 || lvalue < EXIM_ARITH_MIN/1024) { @@ -2211,7 +2210,6 @@ switch (type) } lvalue *= 1024; } - while (*(mp += 2)); } else lvalue = (lvalue + 512)/1024; @@ -2489,6 +2487,7 @@ switch(ol->type & opt_mask) int_eximarith_t x = *((int_eximarith_t *)value); if (!no_labels) printf("%s = ", name); if (x == 0) printf("0\n"); + else if ((x & ((1<<30)-1)) == 0) printf(PR_EXIM_ARITH "T\n", x >> 30); else if ((x & ((1<<20)-1)) == 0) printf(PR_EXIM_ARITH "G\n", x >> 20); else if ((x & ((1<<10)-1)) == 0) printf(PR_EXIM_ARITH "M\n", x >> 10); else printf(PR_EXIM_ARITH "K\n", x); diff --git a/test/paniclog/0415 b/test/paniclog/0415 index 68a0f4491..8ab0c2cb9 100644 --- a/test/paniclog/0415 +++ b/test/paniclog/0415 @@ -1,5 +1,5 @@ 1999-03-02 09:44:33 Exim configuration error in line 15 of TESTSUITE/test-config: - absolute value of integer "4000E" is too large (overflow) + absolute value of integer "4000Z" is too large (overflow) 1999-03-02 09:44:33 Exim configuration error in line 15 of TESTSUITE/test-config: extra characters follow integer value for check_spool_space 1999-03-02 09:44:33 Exim configuration error in line 16 of TESTSUITE/test-config: diff --git a/test/scripts/0000-Basic/0415 b/test/scripts/0000-Basic/0415 index 09f582b62..411efac16 100644 --- a/test/scripts/0000-Basic/0415 +++ b/test/scripts/0000-Basic/0415 @@ -1,6 +1,6 @@ # overflow in integer options 1 -exim -DARG1=4000E -bP check_spool_space +exim -DARG1=4000Z -bP check_spool_space **** exim -DARG1=4000G -bP check_spool_space **** diff --git a/test/stderr/0415 b/test/stderr/0415 index 429262094..211d7323b 100644 --- a/test/stderr/0415 +++ b/test/stderr/0415 @@ -1,6 +1,6 @@ LOG: PANIC DIE Exim configuration error in line 15 of TESTSUITE/test-config: - absolute value of integer "4000E" is too large (overflow) + absolute value of integer "4000Z" is too large (overflow) LOG: PANIC DIE Exim configuration error in line 15 of TESTSUITE/test-config: extra characters follow integer value for check_spool_space diff --git a/test/stdout/0415 b/test/stdout/0415 index 7215cca80..619f9f373 100644 --- a/test/stdout/0415 +++ b/test/stdout/0415 @@ -1,4 +1,4 @@ -check_spool_space = 4096000G +check_spool_space = 4000G queue_only_load = 2000000.123 finduser_retries = 0 finduser_retries = 999999999 -- 2.25.1