setitimer(2): increase timer limit to UINT_MAX seconds
authorcheloha <cheloha@openbsd.org>
Fri, 18 Jun 2021 15:59:14 +0000 (15:59 +0000)
committercheloha <cheloha@openbsd.org>
Fri, 18 Jun 2021 15:59:14 +0000 (15:59 +0000)
Currently setitimer(2) rejects timers larger than 100 million seconds
and sets EINVAL.

With the change to kclock timeouts there is no longer any reason to
use this arbitrary value.  Kclock timeouts support the full range of a
timespec, so we can increase the upper bound without practical risk of
arithmetic overflow.

If we push the limit to UINT_MAX we can support the full input range
of alarm(3).  We can then simplify the alarm.3 manpage in a separate
patch.

We can push the limit even higher in the future if we find software
that doesn't like the UINT_MAX limit.  Until then, UINT_MAX seconds
(over 68 years) is plenty for all practical timers.

ok claudio@

sys/kern/kern_time.c

index 7a6febf..7c87984 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_time.c,v 1.153 2021/06/11 16:36:34 cheloha Exp $ */
+/*     $OpenBSD: kern_time.c,v 1.154 2021/06/18 15:59:14 cheloha Exp $ */
 /*     $NetBSD: kern_time.c,v 1.20 1996/02/18 11:57:06 fvdl Exp $      */
 
 /*
@@ -709,15 +709,16 @@ out:
 int
 itimerfix(struct itimerval *itv)
 {
+       static const struct timeval max = { .tv_sec = UINT_MAX, .tv_usec = 0 };
        struct timeval min_interval = { .tv_sec = 0, .tv_usec = tick };
 
        if (itv->it_value.tv_sec < 0 || !timerisvalid(&itv->it_value))
                return EINVAL;
-       if (itv->it_value.tv_sec > 100000000)
+       if (timercmp(&itv->it_value, &max, >))
                return EINVAL;
        if (itv->it_interval.tv_sec < 0 || !timerisvalid(&itv->it_interval))
                return EINVAL;
-       if (itv->it_interval.tv_sec > 100000000)
+       if (timercmp(&itv->it_interval, &max, >))
                return EINVAL;
 
        if (!timerisset(&itv->it_value))