Hi,

setitimer(2) has a one hundred million second upper bound for timers.
Any timer interval larger than this is considered invalid and we set
EINVAL.

There is no longer any reason to use this particular limit.  Kclock
timeouts support the full range of a timespec, so we can trivially
increase the upper bound without any practical risk of overflow.

This patch increases the upper bound to UINT_MAX seconds.

Why UINT_MAX?  UINT_MAX is the largest possible input to alarm(3).  We
could then simplify the alarm(3) manpage and the libc alarm.c code in
a subsequent patch.  POSIX says alarm(3) "is always successful".  Our
implementation can fail.  It would be nicer/simpler if ours were free
of failure modes.

ok?

Index: kern_time.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_time.c,v
retrieving revision 1.153
diff -u -p -r1.153 kern_time.c
--- kern_time.c 11 Jun 2021 16:36:34 -0000      1.153
+++ kern_time.c 11 Jun 2021 17:13:49 -0000
@@ -709,15 +709,16 @@ out:
 int
 itimerfix(struct itimerval *itv)
 {
+       struct timeval max_interval = { .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_interval, >))
                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_interval, >))
                return EINVAL;
 
        if (!timerisset(&itv->it_value))

Reply via email to