futex: Fix buggy timeout
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 14 Dec 2018 21:49:19 +0000 (16:49 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 14 Dec 2018 22:23:48 +0000 (17:23 -0500)
We were sending the abs_timeout timespec in all cases, even if we
weren't passed a timeout.  That means we were signing up for a timespec
from uninitialized data!  Who knows when that will go off.  If it is far
in the future, we're likely to never notice.  If it happens to go off,
we'll have futexes timing out that shouldn't time out - chaos!

I had a VM that was up long enough that these timers were going off, and
I noticed really old alarms in the "alarm pcpu" output.  They would fire
instantly too.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/pthread/futex.c

index 62ce345..300b310 100644 (file)
@@ -150,7 +150,7 @@ int futex(int *uaddr, int op, int val, const struct timespec *timeout,
 
        switch (op) {
        case FUTEX_WAIT:
-               return futex_wait(uaddr, val, abs_timeout);
+               return futex_wait(uaddr, val, timeout ? abs_timeout : NULL);
        case FUTEX_WAKE:
                return futex_wake(uaddr, val);
        default: