Fix parsing of option type Kint (integer, stored in K). Bug 2348
authorJeremy Harris <jgh146exb@wizmail.org>
Fri, 14 Dec 2018 14:03:18 +0000 (14:03 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Fri, 14 Dec 2018 14:07:29 +0000 (14:07 +0000)
Broken-by: a45431fa71
src/src/readconf.c
test/paniclog/0415
test/scripts/0000-Basic/0415
test/stderr/0415
test/stdout/0415

index f21ce4d..44452ba 100644 (file)
@@ -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);
index 68a0f44..8ab0c2c 100644 (file)
@@ -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:
index 09f582b..411efac 100644 (file)
@@ -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
 ****
index 4292620..211d732 100644 (file)
@@ -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
index 7215cca..619f9f3 100644 (file)
@@ -1,4 +1,4 @@
-check_spool_space = 4096000G
+check_spool_space = 4000G
 queue_only_load = 2000000.123
 finduser_retries = 0
 finduser_retries = 999999999