From c66c5b38e0ad136aa9301fd60aafea736d433c57 Mon Sep 17 00:00:00 2001 From: Jonathan Gray Date: Thu, 20 Feb 2020 13:18:01 +1100 Subject: [PATCH] util: futex fixes for OpenBSD Fix absolute to relative timeout computation. Add sanity checks to futex_wait() - handle the NULL timeout pointer case - avoid negative cases. From Matthieu Herrb and Scott Cheloha. Fixes: c91997b6c43 ("util/futex: use futex syscall on OpenBSD") Signed-off-by: Jonathan Gray Acked-by: Eric Engestrom Part-of: --- src/util/futex.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/util/futex.h b/src/util/futex.h index 4d712e2ef2d..43097f4cd5b 100644 --- a/src/util/futex.h +++ b/src/util/futex.h @@ -100,9 +100,16 @@ static inline int futex_wake(uint32_t *addr, int count) static inline int futex_wait(uint32_t *addr, int32_t value, const struct timespec *timeout) { - struct timespec tsrel, tsnow; - clock_gettime(CLOCK_MONOTONIC, &tsnow); - timespecsub(timeout, &tsrel, &tsrel); + struct timespec tsnow, tsrel; + + if (timeout == NULL) + return futex(addr, FUTEX_WAIT, value, NULL, NULL); + + clock_gettime(CLOCK_MONOTONIC, &tsnow); + if (timespeccmp(&tsnow, timeout, <)) + timespecsub(timeout, &tsnow, &tsrel); + else + timespecclear(&tsrel); return futex(addr, FUTEX_WAIT, value, &tsrel, NULL); } -- 2.30.2