diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index c23139298c63..6d3ea9770f4c 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -1042,7 +1042,12 @@ sys_recvmmsg(struct lwp *l, const struct sys_recvmmsg_args *uap, if ((error = copyin(SCARG(uap, timeout), &ts, sizeof(ts))) != 0) return error; getnanotime(&now); - timespecadd(&now, &ts, &ts); + if (timespecaddok(&now, &ts)) { + timespecadd(&now, &ts, &ts); + } else { + ts.tv_sec = __type_max(time_t); + ts.tv_nsec = 999999999L; + } } s = SCARG(uap, s); @@ -1109,8 +1114,7 @@ sys_recvmmsg(struct lwp *l, const struct sys_recvmmsg_args *uap, if (SCARG(uap, timeout)) { getnanotime(&now); - timespecsub(&now, &ts, &now); - if (now.tv_sec > 0) + if (timespeccmp(&ts, &now, <)) break; }