librthread: validate timespec inputs with timespecisvalid(3)
authorcheloha <cheloha@openbsd.org>
Sat, 14 May 2022 14:52:20 +0000 (14:52 +0000)
committercheloha <cheloha@openbsd.org>
Sat, 14 May 2022 14:52:20 +0000 (14:52 +0000)
ok millert@

lib/librthread/rthread_rwlock_compat.c
lib/librthread/rthread_sem.c
lib/librthread/rthread_sem_compat.c

index f9dc6f8..8c6e5cf 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: rthread_rwlock_compat.c,v 1.1 2019/02/13 13:15:39 mpi Exp $ */
+/*     $OpenBSD: rthread_rwlock_compat.c,v 1.2 2022/05/14 14:52:20 cheloha Exp $ */
 /*
  * Copyright (c) 2004,2005 Ted Unangst <tedu@openbsd.org>
  * Copyright (c) 2012 Philip Guenther <guenther@openbsd.org>
@@ -143,8 +143,7 @@ int
 pthread_rwlock_timedrdlock(pthread_rwlock_t *lockp,
     const struct timespec *abstime)
 {
-       if (abstime == NULL || abstime->tv_nsec < 0 ||
-           abstime->tv_nsec >= 1000000000)
+       if (abstime == NULL || !timespecisvalid(abstime))
                return (EINVAL);
        return (_rthread_rwlock_rdlock(lockp, abstime, 0));
 }
@@ -210,8 +209,7 @@ int
 pthread_rwlock_timedwrlock(pthread_rwlock_t *lockp,
     const struct timespec *abstime)
 {
-       if (abstime == NULL || abstime->tv_nsec < 0 ||
-           abstime->tv_nsec >= 1000000000)
+       if (abstime == NULL || !timespecisvalid(abstime))
                return (EINVAL);
        return (_rthread_rwlock_wrlock(lockp, abstime, 0));
 }
index 172155e..1bf189a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: rthread_sem.c,v 1.32 2020/04/06 00:01:08 pirofti Exp $ */
+/*     $OpenBSD: rthread_sem.c,v 1.33 2022/05/14 14:52:20 cheloha Exp $ */
 /*
  * Copyright (c) 2004,2005,2013 Ted Unangst <tedu@openbsd.org>
  * Copyright (c) 2018 Paul Irofti <paul@irofti.net>
@@ -254,8 +254,7 @@ sem_timedwait(sem_t *semp, const struct timespec *abstime)
        int error;
        PREP_CANCEL_POINT(tib);
 
-       if (!semp || !(sem = *semp) || abstime == NULL ||
-          abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) {
+       if (!semp || !(sem = *semp) || !abstime || !timespecisvalid(abstime)) {
                errno = EINVAL;
                return (-1);
        }
index 81309d5..6800822 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: rthread_sem_compat.c,v 1.1 2018/06/08 13:53:01 pirofti Exp $ */
+/*     $OpenBSD: rthread_sem_compat.c,v 1.2 2022/05/14 14:52:20 cheloha Exp $ */
 /*
  * Copyright (c) 2004,2005,2013 Ted Unangst <tedu@openbsd.org>
  * All Rights Reserved.
@@ -19,6 +19,7 @@
 #include <sys/types.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
+#include <sys/time.h>
 
 #include <errno.h>
 #include <fcntl.h>
@@ -266,8 +267,7 @@ sem_timedwait(sem_t *semp, const struct timespec *abstime)
        int r;
        PREP_CANCEL_POINT(tib);
 
-       if (!semp || !(sem = *semp) || abstime == NULL ||
-           abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) {
+       if (!semp || !(sem = *semp) || !abstime || !timespecisvalid(abstime)) {
                errno = EINVAL;
                return (-1);
        }