Add a missing check for negative tv_sec when setting the timeout.
authormillert <millert@openbsd.org>
Fri, 8 Jul 2022 20:47:24 +0000 (20:47 +0000)
committermillert <millert@openbsd.org>
Fri, 8 Jul 2022 20:47:24 +0000 (20:47 +0000)
Also clear the entire timeout if the remaining time becomes negative
instead of just clearing tv_sec or tv_nsec.  OK cheloha@.

usr.sbin/cron/cron.c

index b00ffc6..54b5574 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cron.c,v 1.81 2022/07/07 20:58:57 jca Exp $   */
+/*     $OpenBSD: cron.c,v 1.82 2022/07/08 20:47:24 millert Exp $       */
 
 /* Copyright 1988,1990,1993,1994 by Paul Vixie
  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
@@ -358,6 +358,8 @@ cron_sleep(time_t target, sigset_t *mask)
        clock_gettime(CLOCK_REALTIME, &t1);
        t1.tv_sec += GMToff;
        timeout.tv_sec = (target * SECONDS_PER_MINUTE - t1.tv_sec) + 1;
+       if (timeout.tv_sec < 0)
+               timeout.tv_sec = 0;
        timeout.tv_nsec = 0;
 
        pfd[0].fd = cronSock;
@@ -417,9 +419,7 @@ cron_sleep(time_t target, sigset_t *mask)
                timespecsub(&timeout, &t1, &timeout);
                memcpy(&t1, &t2, sizeof(t1));
                if (timeout.tv_sec < 0)
-                       timeout.tv_sec = 0;
-               if (timeout.tv_nsec < 0)
-                       timeout.tv_nsec = 0;
+                       timespecclear(&timeout);
        }
 }