libc, librthread: _twait: fully validate absolute timeout
authorcheloha <cheloha@openbsd.org>
Wed, 8 Nov 2023 15:51:28 +0000 (15:51 +0000)
committercheloha <cheloha@openbsd.org>
Wed, 8 Nov 2023 15:51:28 +0000 (15:51 +0000)
Use timespecisvalid(3) to check both bounds for tv_nsec.

Link: https://marc.info/?l=openbsd-tech&m=169913314230496&w=2
ok miod@

lib/libc/thread/synch.h
lib/librthread/synch.h

index 6b9fab1..c417822 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: synch.h,v 1.7 2021/06/13 21:11:54 kettenis Exp $ */
+/*     $OpenBSD: synch.h,v 1.8 2023/11/08 15:51:28 cheloha Exp $ */
 /*
  * Copyright (c) 2017 Martin Pieuchot
  *
@@ -41,7 +41,7 @@ _twait(volatile uint32_t *p, int val, clockid_t clockid, const struct timespec *
                return error;
        }
 
-       if (abs->tv_nsec >= 1000000000 || WRAP(clock_gettime)(clockid, &rel))
+       if (!timespecisvalid(abs) || WRAP(clock_gettime)(clockid, &rel))
                return EINVAL;
 
        rel.tv_sec = abs->tv_sec - rel.tv_sec;
index e6ad156..516a97a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: synch.h,v 1.8 2021/06/13 21:11:54 kettenis Exp $ */
+/*     $OpenBSD: synch.h,v 1.9 2023/11/08 15:51:28 cheloha Exp $ */
 /*
  * Copyright (c) 2017 Martin Pieuchot
  *
@@ -41,7 +41,7 @@ _twait(volatile uint32_t *p, int val, clockid_t clockid, const struct timespec *
                return error;
        }
 
-       if (abs->tv_nsec >= 1000000000 || clock_gettime(clockid, &rel))
+       if (!timespecisvalid(abs) || clock_gettime(clockid, &rel))
                return EINVAL;
 
        rel.tv_sec = abs->tv_sec - rel.tv_sec;