From 7c0e04f42e6bd24a3ed5929e9627c18ea50a2a1a Mon Sep 17 00:00:00 2001 From: davidxu Date: Wed, 12 Jan 2005 05:55:52 +0000 Subject: Let _umtx_op directly return error code rather than from errno because errno can be tampered potentially by nested signal handle. Now all error codes are returned in negative value, positive value are reserved for future expansion. --- sys/kern/kern_umtx.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'sys/kern/kern_umtx.c') diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index 158210c..bcdddab 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -679,7 +679,6 @@ do_wake(struct thread *td, void *uaddr, int n_wake) ret = umtxq_signal(&key, n_wake); umtxq_unlock(&key); umtx_key_release(&key); - td->td_retval[0] = ret; return (0); } @@ -712,15 +711,20 @@ _umtx_op(struct thread *td, struct _umtx_op_args *uap) else { error = copyin(uap->uaddr2, &abstime, sizeof(abstime)); if (error != 0) - return (error); + break; + printf("uap->abstime: %d.%ld\n", abstime.tv_sec, abstime.tv_nsec); if (abstime.tv_nsec >= 1000000000 || - abstime.tv_nsec < 0) - return (EINVAL); + abstime.tv_nsec < 0) { + error = EINVAL; + break; + } ts = &abstime; } - return do_lock(td, uap->umtx, uap->id, ts); + error = do_lock(td, uap->umtx, uap->id, ts); + break; case UMTX_OP_UNLOCK: - return do_unlock(td, uap->umtx, uap->id); + error = do_unlock(td, uap->umtx, uap->id); + break; case UMTX_OP_WAIT: /* Allow a null timespec (wait forever). */ if (uap->uaddr2 == NULL) @@ -728,16 +732,23 @@ _umtx_op(struct thread *td, struct _umtx_op_args *uap) else { error = copyin(uap->uaddr2, &abstime, sizeof(abstime)); if (error != 0) - return (error); + break; if (abstime.tv_nsec >= 1000000000 || - abstime.tv_nsec < 0) - return (EINVAL); + abstime.tv_nsec < 0) { + error = EINVAL; + break; + } ts = &abstime; } - return do_wait(td, uap->umtx, uap->id, ts); + error = do_wait(td, uap->umtx, uap->id, ts); + break; case UMTX_OP_WAKE: - return do_wake(td, uap->umtx, uap->id); + error = do_wake(td, uap->umtx, uap->id); + break; default: - return (EINVAL); + error = EINVAL; + break; } + td->td_retval[0] = -error; + return (0); } -- cgit v1.1