Fix parsing of cmdline -os & -pr options. Bug 2538
authorHeiko Schlittermann (HS12-RIPE) <hs@schlittermann.de>
Sun, 8 Mar 2020 16:00:28 +0000 (16:00 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Sun, 8 Mar 2020 16:00:28 +0000 (16:00 +0000)
    Found & fixed by Heiko; coding massaged by jgh
Broken-by: 777cc7485c
src/src/exim.c
src/src/receive.c

index dfd6df76cb364f3de83e3ad59630455826b7f229..63ac620e7b1351b36e4d73294a809d4486e9fbdf 100644 (file)
@@ -3138,8 +3138,7 @@ for (i = 1; i < argc; i++)
 
       case 'm':
       case 'o':
-       if (!*argrest) {}
-       else badarg = TRUE;
+       if (*argrest) badarg = TRUE;
        break;
 
       /* -oP <name>: set pid file path for daemon
@@ -3157,27 +3156,24 @@ for (i = 1; i < argc; i++)
 
       case 'r':
       case 's':
-       if (!*argrest)
-         {
-         int *tp = (*argrest == 'r')?
-           &arg_receive_timeout : &arg_smtp_receive_timeout;
-         if (argrest[1] == 0)
-           {
-           if (i+1 < argc) *tp= readconf_readtime(argv[++i], 0, FALSE);
-           }
-         else *tp = readconf_readtime(argrest + 1, 0, FALSE);
-         if (*tp < 0)
-           exim_fail("exim: bad time value %s: abandoned\n", argv[i]);
-         }
-       else badarg = TRUE;
+       {
+       int * tp = argrest[-1] == 'r'
+         ? &arg_receive_timeout : &arg_smtp_receive_timeout;
+       if (*argrest)
+         *tp = readconf_readtime(argrest, 0, FALSE);
+       else if (i+1 < argc)
+         *tp = readconf_readtime(argv[++i], 0, FALSE);
+
+       if (*tp < 0)
+         exim_fail("exim: bad time value %s: abandoned\n", argv[i]);
+       }
        break;
 
       /* -oX <list>: Override local_interfaces and/or default daemon ports */
 
       case 'X':
-       if (!*argrest)
-         override_local_interfaces = argv[++i];
-       else badarg = TRUE;
+       if (*argrest) badarg = TRUE;
+       else override_local_interfaces = argv[++i];
        break;
 
       /* Unknown -o argument */
index 6d20a5cdae255ee68582545a7c3db1f974ec7203..8f3bfefacd162cfaaa75d85b0f765e0322983034 100644 (file)
@@ -645,6 +645,11 @@ if (!f.dot_ends)
   {
   int last_ch = '\n';
 
+/*XXX we do a gettimeofday before checking for every received char,
+which is hardly clever.  The function-indirection doesn't help, but
+an additional function to check for nonempty read buffer would help.
+See stdin_getc() / smtp_getc() / tls_getc() / bdat_getc(). */
+
   for ( ;
        log_close_chk(), (ch = (receive_getc)(GETC_BUFFER_UNLIMITED)) != EOF;
        last_ch = ch)