Module Name: src Committed By: apb Date: Fri Mar 8 09:33:00 UTC 2013
Modified Files: src/sys/kern: sys_sig.c Log Message: Properly differentiate between infinite timeout and zero timeout. Local variable timo = -1 is used for zero timeout (non blocking mode). Fixes PR 47625 from anthony.mallet To generate a diff of this commit: cvs rdiff -u -r1.40 -r1.41 src/sys/kern/sys_sig.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/sys_sig.c diff -u src/sys/kern/sys_sig.c:1.40 src/sys/kern/sys_sig.c:1.41 --- src/sys/kern/sys_sig.c:1.40 Fri Mar 8 08:48:38 2013 +++ src/sys/kern/sys_sig.c Fri Mar 8 09:32:59 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_sig.c,v 1.40 2013/03/08 08:48:38 apb Exp $ */ +/* $NetBSD: sys_sig.c,v 1.41 2013/03/08 09:32:59 apb Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.40 2013/03/08 08:48:38 apb Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.41 2013/03/08 09:32:59 apb Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -728,8 +728,12 @@ sigtimedwait1(struct lwp *l, const struc return error; timo = tstohz(&ts); - if (timo == 0 && ts.tv_sec == 0 && ts.tv_nsec != 0) - timo++; + if (timo == 0) { + if (ts.tv_sec == 0 && ts.tv_nsec == 0) + timo = -1; /* do not block */ + else + timo = 1; /* the shortest possible timeout */ + } /* * Remember current uptime, it would be used in @@ -738,7 +742,7 @@ sigtimedwait1(struct lwp *l, const struc getnanouptime(&tsstart); } else { memset(&tsstart, 0, sizeof(tsstart)); /* XXXgcc */ - timo = 0; + timo = 0; /* infinite timeout */ } error = (*fetchss)(SCARG(uap, set), &l->l_sigwaitset, @@ -765,6 +769,12 @@ sigtimedwait1(struct lwp *l, const struc goto out; } + if (timo < 0) { + /* If not allowed to block, return an error */ + mutex_exit(p->p_lock); + return EAGAIN; + } + /* * Set up the sigwait list and wait for signal to arrive. * We can either be woken up or time out.