xref: /netbsd-src/sys/kern/sys_sig.c (revision 96230fab84e26a6435963032070e916a951a8b2e)
1 /*	$NetBSD: sys_sig.c,v 1.17 2008/10/15 06:51:20 wrstuden Exp $	*/
2 
3 /*-
4  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Andrew Doran.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*
33  * Copyright (c) 1982, 1986, 1989, 1991, 1993
34  *	The Regents of the University of California.  All rights reserved.
35  * (c) UNIX System Laboratories, Inc.
36  * All or some portions of this file are derived from material licensed
37  * to the University of California by American Telephone and Telegraph
38  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
39  * the permission of UNIX System Laboratories, Inc.
40  *
41  * Redistribution and use in source and binary forms, with or without
42  * modification, are permitted provided that the following conditions
43  * are met:
44  * 1. Redistributions of source code must retain the above copyright
45  *    notice, this list of conditions and the following disclaimer.
46  * 2. Redistributions in binary form must reproduce the above copyright
47  *    notice, this list of conditions and the following disclaimer in the
48  *    documentation and/or other materials provided with the distribution.
49  * 3. Neither the name of the University nor the names of its contributors
50  *    may be used to endorse or promote products derived from this software
51  *    without specific prior written permission.
52  *
53  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
54  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
55  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
56  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
57  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
58  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
59  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
60  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
61  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
62  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
63  * SUCH DAMAGE.
64  *
65  *	@(#)kern_sig.c	8.14 (Berkeley) 5/14/95
66  */
67 
68 #include <sys/cdefs.h>
69 __KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.17 2008/10/15 06:51:20 wrstuden Exp $");
70 
71 #include "opt_ptrace.h"
72 #include "opt_compat_netbsd.h"
73 #include "opt_compat_netbsd32.h"
74 
75 #include <sys/param.h>
76 #include <sys/kernel.h>
77 #include <sys/signalvar.h>
78 #include <sys/proc.h>
79 #include <sys/pool.h>
80 #include <sys/sa.h>
81 #include <sys/savar.h>
82 #include <sys/syscallargs.h>
83 #include <sys/kauth.h>
84 #include <sys/wait.h>
85 #include <sys/kmem.h>
86 
87 #ifdef COMPAT_16
88 /* ARGSUSED */
89 int
90 compat_16_sys___sigaction14(struct lwp *l, const struct compat_16_sys___sigaction14_args *uap, register_t *retval)
91 {
92 	/* {
93 		syscallarg(int)				signum;
94 		syscallarg(const struct sigaction *)	nsa;
95 		syscallarg(struct sigaction *)		osa;
96 	} */
97 	struct sigaction	nsa, osa;
98 	int			error;
99 
100 	if (SCARG(uap, nsa)) {
101 		error = copyin(SCARG(uap, nsa), &nsa, sizeof(nsa));
102 		if (error)
103 			return (error);
104 	}
105 	error = sigaction1(l, SCARG(uap, signum),
106 	    SCARG(uap, nsa) ? &nsa : 0, SCARG(uap, osa) ? &osa : 0,
107 	    NULL, 0);
108 	if (error)
109 		return (error);
110 	if (SCARG(uap, osa)) {
111 		error = copyout(&osa, SCARG(uap, osa), sizeof(osa));
112 		if (error)
113 			return (error);
114 	}
115 	return (0);
116 }
117 #endif
118 
119 /* ARGSUSED */
120 int
121 sys___sigaction_sigtramp(struct lwp *l, const struct sys___sigaction_sigtramp_args *uap, register_t *retval)
122 {
123 	/* {
124 		syscallarg(int)				signum;
125 		syscallarg(const struct sigaction *)	nsa;
126 		syscallarg(struct sigaction *)		osa;
127 		syscallarg(void *)			tramp;
128 		syscallarg(int)				vers;
129 	} */
130 	struct sigaction nsa, osa;
131 	int error;
132 
133 	if (SCARG(uap, nsa)) {
134 		error = copyin(SCARG(uap, nsa), &nsa, sizeof(nsa));
135 		if (error)
136 			return (error);
137 	}
138 	error = sigaction1(l, SCARG(uap, signum),
139 	    SCARG(uap, nsa) ? &nsa : 0, SCARG(uap, osa) ? &osa : 0,
140 	    SCARG(uap, tramp), SCARG(uap, vers));
141 	if (error)
142 		return (error);
143 	if (SCARG(uap, osa)) {
144 		error = copyout(&osa, SCARG(uap, osa), sizeof(osa));
145 		if (error)
146 			return (error);
147 	}
148 	return (0);
149 }
150 
151 /*
152  * Manipulate signal mask.  Note that we receive new mask, not pointer, and
153  * return old mask as return value; the library stub does the rest.
154  */
155 int
156 sys___sigprocmask14(struct lwp *l, const struct sys___sigprocmask14_args *uap, register_t *retval)
157 {
158 	/* {
159 		syscallarg(int)			how;
160 		syscallarg(const sigset_t *)	set;
161 		syscallarg(sigset_t *)		oset;
162 	} */
163 	struct proc	*p = l->l_proc;
164 	sigset_t	nss, oss;
165 	int		error;
166 
167 	if (SCARG(uap, set)) {
168 		error = copyin(SCARG(uap, set), &nss, sizeof(nss));
169 		if (error)
170 			return (error);
171 	}
172 	mutex_enter(p->p_lock);
173 	error = sigprocmask1(l, SCARG(uap, how),
174 	    SCARG(uap, set) ? &nss : 0, SCARG(uap, oset) ? &oss : 0);
175 	mutex_exit(p->p_lock);
176 	if (error)
177 		return (error);
178 	if (SCARG(uap, oset)) {
179 		error = copyout(&oss, SCARG(uap, oset), sizeof(oss));
180 		if (error)
181 			return (error);
182 	}
183 	return (0);
184 }
185 
186 /* ARGSUSED */
187 int
188 sys___sigpending14(struct lwp *l, const struct sys___sigpending14_args *uap, register_t *retval)
189 {
190 	/* {
191 		syscallarg(sigset_t *)	set;
192 	} */
193 	sigset_t ss;
194 
195 	sigpending1(l, &ss);
196 	return (copyout(&ss, SCARG(uap, set), sizeof(ss)));
197 }
198 
199 /*
200  * Suspend process until signal, providing mask to be set in the meantime.
201  * Note nonstandard calling convention: libc stub passes mask, not pointer,
202  * to save a copyin.
203  */
204 /* ARGSUSED */
205 int
206 sys___sigsuspend14(struct lwp *l, const struct sys___sigsuspend14_args *uap, register_t *retval)
207 {
208 	/* {
209 		syscallarg(const sigset_t *)	set;
210 	} */
211 	sigset_t	ss;
212 	int		error;
213 
214 	if (SCARG(uap, set)) {
215 		error = copyin(SCARG(uap, set), &ss, sizeof(ss));
216 		if (error)
217 			return (error);
218 	}
219 
220 	return (sigsuspend1(l, SCARG(uap, set) ? &ss : 0));
221 }
222 
223 /* ARGSUSED */
224 int
225 sys___sigaltstack14(struct lwp *l, const struct sys___sigaltstack14_args *uap, register_t *retval)
226 {
227 	/* {
228 		syscallarg(const struct sigaltstack *)	nss;
229 		syscallarg(struct sigaltstack *)	oss;
230 	} */
231 	struct sigaltstack	nss, oss;
232 	int			error;
233 
234 	if (SCARG(uap, nss)) {
235 		error = copyin(SCARG(uap, nss), &nss, sizeof(nss));
236 		if (error)
237 			return (error);
238 	}
239 	error = sigaltstack1(l,
240 	    SCARG(uap, nss) ? &nss : 0, SCARG(uap, oss) ? &oss : 0);
241 	if (error)
242 		return (error);
243 	if (SCARG(uap, oss)) {
244 		error = copyout(&oss, SCARG(uap, oss), sizeof(oss));
245 		if (error)
246 			return (error);
247 	}
248 	return (0);
249 }
250 
251 /* ARGSUSED */
252 int
253 sys_kill(struct lwp *l, const struct sys_kill_args *uap, register_t *retval)
254 {
255 	/* {
256 		syscallarg(int)	pid;
257 		syscallarg(int)	signum;
258 	} */
259 	struct proc	*p;
260 	ksiginfo_t	ksi;
261 	int signum = SCARG(uap, signum);
262 	int error;
263 
264 	if ((u_int)signum >= NSIG)
265 		return (EINVAL);
266 	KSI_INIT(&ksi);
267 	ksi.ksi_signo = signum;
268 	ksi.ksi_code = SI_USER;
269 	ksi.ksi_pid = l->l_proc->p_pid;
270 	ksi.ksi_uid = kauth_cred_geteuid(l->l_cred);
271 	if (SCARG(uap, pid) > 0) {
272 		/* kill single process */
273 		mutex_enter(proc_lock);
274 		if ((p = p_find(SCARG(uap, pid), PFIND_LOCKED)) == NULL) {
275 			mutex_exit(proc_lock);
276 			return (ESRCH);
277 		}
278 		mutex_enter(p->p_lock);
279 		error = kauth_authorize_process(l->l_cred,
280 		    KAUTH_PROCESS_SIGNAL, p, KAUTH_ARG(signum),
281 		    NULL, NULL);
282 		if (!error && signum) {
283 			kpsignal2(p, &ksi);
284 		}
285 		mutex_exit(p->p_lock);
286 		mutex_exit(proc_lock);
287 		return (error);
288 	}
289 	switch (SCARG(uap, pid)) {
290 	case -1:		/* broadcast signal */
291 		return (killpg1(l, &ksi, 0, 1));
292 	case 0:			/* signal own process group */
293 		return (killpg1(l, &ksi, 0, 0));
294 	default:		/* negative explicit process group */
295 		return (killpg1(l, &ksi, -SCARG(uap, pid), 0));
296 	}
297 	/* NOTREACHED */
298 }
299 
300 /* ARGSUSED */
301 int
302 sys_getcontext(struct lwp *l, const struct sys_getcontext_args *uap, register_t *retval)
303 {
304 	/* {
305 		syscallarg(struct __ucontext *) ucp;
306 	} */
307 	struct proc *p = l->l_proc;
308 	ucontext_t uc;
309 
310 	mutex_enter(p->p_lock);
311 	getucontext(l, &uc);
312 	mutex_exit(p->p_lock);
313 
314 	return (copyout(&uc, SCARG(uap, ucp), sizeof (*SCARG(uap, ucp))));
315 }
316 
317 /* ARGSUSED */
318 int
319 sys_setcontext(struct lwp *l, const struct sys_setcontext_args *uap, register_t *retval)
320 {
321 	/* {
322 		syscallarg(const ucontext_t *) ucp;
323 	} */
324 	struct proc *p = l->l_proc;
325 	ucontext_t uc;
326 	int error;
327 
328 	error = copyin(SCARG(uap, ucp), &uc, sizeof (uc));
329 	if (error)
330 		return (error);
331 	if (!(uc.uc_flags & _UC_CPU))
332 		return (EINVAL);
333 	mutex_enter(p->p_lock);
334 	error = setucontext(l, &uc);
335 	mutex_exit(p->p_lock);
336 	if (error)
337  		return (error);
338 
339 	return (EJUSTRETURN);
340 }
341 
342 /*
343  * sigtimedwait(2) system call, used also for implementation
344  * of sigwaitinfo() and sigwait().
345  *
346  * This only handles single LWP in signal wait. libpthread provides
347  * it's own sigtimedwait() wrapper to DTRT WRT individual threads.
348  */
349 int
350 sys___sigtimedwait(struct lwp *l, const struct sys___sigtimedwait_args *uap, register_t *retval)
351 {
352 
353 	return __sigtimedwait1(l, uap, retval, copyout, copyin, copyout);
354 }
355 
356 int
357 sigaction1(struct lwp *l, int signum, const struct sigaction *nsa,
358 	struct sigaction *osa, const void *tramp, int vers)
359 {
360 	struct proc *p;
361 	struct sigacts *ps;
362 	sigset_t tset;
363 	int prop, error;
364 	ksiginfoq_t kq;
365 
366 	if (signum <= 0 || signum >= NSIG)
367 		return (EINVAL);
368 
369 	p = l->l_proc;
370 	error = 0;
371 	ksiginfo_queue_init(&kq);
372 
373 	/*
374 	 * Trampoline ABI version 0 is reserved for the legacy kernel
375 	 * provided on-stack trampoline.  Conversely, if we are using a
376 	 * non-0 ABI version, we must have a trampoline.  Only validate the
377 	 * vers if a new sigaction was supplied. Emulations use legacy
378 	 * kernel trampolines with version 0, alternatively check for that
379 	 * too.
380 	 */
381 	if ((vers != 0 && tramp == NULL) ||
382 #ifdef SIGTRAMP_VALID
383 	    (nsa != NULL &&
384 	    ((vers == 0) ?
385 		(p->p_emul->e_sigcode == NULL) :
386 		!SIGTRAMP_VALID(vers))) ||
387 #endif
388 	    (vers == 0 && tramp != NULL)) {
389 		return (EINVAL);
390 	}
391 
392 	mutex_enter(p->p_lock);
393 
394 	ps = p->p_sigacts;
395 	if (osa)
396 		*osa = SIGACTION_PS(ps, signum);
397 	if (!nsa)
398 		goto out;
399 
400 	prop = sigprop[signum];
401 	if ((nsa->sa_flags & ~SA_ALLBITS) || (prop & SA_CANTMASK)) {
402 		error = EINVAL;
403 		goto out;
404 	}
405 
406 	SIGACTION_PS(ps, signum) = *nsa;
407 	ps->sa_sigdesc[signum].sd_tramp = tramp;
408 	ps->sa_sigdesc[signum].sd_vers = vers;
409 	sigminusset(&sigcantmask, &SIGACTION_PS(ps, signum).sa_mask);
410 
411 	if ((prop & SA_NORESET) != 0)
412 		SIGACTION_PS(ps, signum).sa_flags &= ~SA_RESETHAND;
413 
414 	if (signum == SIGCHLD) {
415 		if (nsa->sa_flags & SA_NOCLDSTOP)
416 			p->p_sflag |= PS_NOCLDSTOP;
417 		else
418 			p->p_sflag &= ~PS_NOCLDSTOP;
419 		if (nsa->sa_flags & SA_NOCLDWAIT) {
420 			/*
421 			 * Paranoia: since SA_NOCLDWAIT is implemented by
422 			 * reparenting the dying child to PID 1 (and trust
423 			 * it to reap the zombie), PID 1 itself is forbidden
424 			 * to set SA_NOCLDWAIT.
425 			 */
426 			if (p->p_pid == 1)
427 				p->p_flag &= ~PK_NOCLDWAIT;
428 			else
429 				p->p_flag |= PK_NOCLDWAIT;
430 		} else
431 			p->p_flag &= ~PK_NOCLDWAIT;
432 
433 		if (nsa->sa_handler == SIG_IGN) {
434 			/*
435 			 * Paranoia: same as above.
436 			 */
437 			if (p->p_pid == 1)
438 				p->p_flag &= ~PK_CLDSIGIGN;
439 			else
440 				p->p_flag |= PK_CLDSIGIGN;
441 		} else
442 			p->p_flag &= ~PK_CLDSIGIGN;
443 	}
444 
445 	if ((nsa->sa_flags & SA_NODEFER) == 0)
446 		sigaddset(&SIGACTION_PS(ps, signum).sa_mask, signum);
447 	else
448 		sigdelset(&SIGACTION_PS(ps, signum).sa_mask, signum);
449 
450 	/*
451 	 * Set bit in p_sigctx.ps_sigignore for signals that are set to
452 	 * SIG_IGN, and for signals set to SIG_DFL where the default is to
453 	 * ignore. However, don't put SIGCONT in p_sigctx.ps_sigignore, as
454 	 * we have to restart the process.
455 	 */
456 	if (nsa->sa_handler == SIG_IGN ||
457 	    (nsa->sa_handler == SIG_DFL && (prop & SA_IGNORE) != 0)) {
458 		/* Never to be seen again. */
459 		sigemptyset(&tset);
460 		sigaddset(&tset, signum);
461 		sigclearall(p, &tset, &kq);
462 		if (signum != SIGCONT) {
463 			/* Easier in psignal */
464 			sigaddset(&p->p_sigctx.ps_sigignore, signum);
465 		}
466 		sigdelset(&p->p_sigctx.ps_sigcatch, signum);
467 	} else {
468 		sigdelset(&p->p_sigctx.ps_sigignore, signum);
469 		if (nsa->sa_handler == SIG_DFL)
470 			sigdelset(&p->p_sigctx.ps_sigcatch, signum);
471 		else
472 			sigaddset(&p->p_sigctx.ps_sigcatch, signum);
473 	}
474 
475 	/*
476 	 * Previously held signals may now have become visible.  Ensure that
477 	 * we check for them before returning to userspace.
478 	 */
479 	if (sigispending(l, 0)) {
480 		lwp_lock(l);
481 		l->l_flag |= LW_PENDSIG;
482 		lwp_unlock(l);
483 	}
484  out:
485 	mutex_exit(p->p_lock);
486 	ksiginfo_queue_drain(&kq);
487 
488 	return (error);
489 }
490 
491 int
492 sigprocmask1(struct lwp *l, int how, const sigset_t *nss, sigset_t *oss)
493 {
494 	int more;
495 	struct proc *p = l->l_proc;
496 	sigset_t *mask;
497 	mask = (p->p_sa != NULL) ? &p->p_sa->sa_sigmask : &l->l_sigmask;
498 
499 	KASSERT(mutex_owned(p->p_lock));
500 
501 	if (oss)
502 		*oss = *mask;
503 	if (nss) {
504 		switch (how) {
505 		case SIG_BLOCK:
506 			sigplusset(nss, mask);
507 			more = 0;
508 			break;
509 		case SIG_UNBLOCK:
510 			sigminusset(nss, mask);
511 			more = 1;
512 			break;
513 		case SIG_SETMASK:
514 			*mask = *nss;
515 			more = 1;
516 			break;
517 		default:
518 			return (EINVAL);
519 		}
520 		sigminusset(&sigcantmask, mask);
521 		if (more && sigispending(l, 0)) {
522 			/*
523 			 * Check for pending signals on return to user.
524 			 */
525 			lwp_lock(l);
526 			l->l_flag |= LW_PENDSIG;
527 			lwp_unlock(l);
528 		}
529 	}
530 
531 	return (0);
532 }
533 
534 void
535 sigpending1(struct lwp *l, sigset_t *ss)
536 {
537 	struct proc *p = l->l_proc;
538 
539 	mutex_enter(p->p_lock);
540 	*ss = l->l_sigpend.sp_set;
541 	sigplusset(&p->p_sigpend.sp_set, ss);
542 	mutex_exit(p->p_lock);
543 }
544 
545 int
546 sigsuspend1(struct lwp *l, const sigset_t *ss)
547 {
548 	struct proc *p;
549 
550 	p = l->l_proc;
551 
552 	if (ss) {
553 		/*
554 		 * When returning from sigsuspend, we want
555 		 * the old mask to be restored after the
556 		 * signal handler has finished.  Thus, we
557 		 * save it here and mark the sigctx structure
558 		 * to indicate this.
559 		 */
560 		mutex_enter(p->p_lock);
561 		l->l_sigrestore = 1;
562 		l->l_sigoldmask = l->l_sigmask;
563 		l->l_sigmask = *ss;
564 		sigminusset(&sigcantmask, &l->l_sigmask);
565 
566 		/* Check for pending signals when sleeping. */
567 		if (sigispending(l, 0)) {
568 			lwp_lock(l);
569 			l->l_flag |= LW_PENDSIG;
570 			lwp_unlock(l);
571 		}
572 		mutex_exit(p->p_lock);
573 	}
574 
575 	while (kpause("pause", true, 0, NULL) == 0)
576 		;
577 
578 	/* always return EINTR rather than ERESTART... */
579 	return (EINTR);
580 }
581 
582 int
583 sigaltstack1(struct lwp *l, const struct sigaltstack *nss,
584 	     struct sigaltstack *oss)
585 {
586 	struct proc *p = l->l_proc;
587 	int error = 0;
588 
589 	mutex_enter(p->p_lock);
590 
591 	if (oss)
592 		*oss = l->l_sigstk;
593 
594 	if (nss) {
595 		if (nss->ss_flags & ~SS_ALLBITS)
596 			error = EINVAL;
597 		else if (nss->ss_flags & SS_DISABLE) {
598 			if (l->l_sigstk.ss_flags & SS_ONSTACK)
599 				error = EINVAL;
600 		} else if (nss->ss_size < MINSIGSTKSZ)
601 			error = ENOMEM;
602 
603 		if (!error)
604 			l->l_sigstk = *nss;
605 	}
606 
607 	mutex_exit(p->p_lock);
608 
609 	return (error);
610 }
611 
612 int
613 __sigtimedwait1(struct lwp *l, const struct sys___sigtimedwait_args *uap, register_t *retval,
614     copyout_t put_info, copyin_t fetch_timeout, copyout_t put_timeout)
615 {
616 	/* {
617 		syscallarg(const sigset_t *) set;
618 		syscallarg(siginfo_t *) info;
619 		syscallarg(struct timespec *) timeout;
620 	} */
621 	struct proc *p = l->l_proc;
622 	int error, signum;
623 	int timo = 0;
624 	struct timespec ts, tsstart, tsnow;
625 	ksiginfo_t *ksi;
626 
627 	memset(&tsstart, 0, sizeof tsstart);	 /* XXX gcc */
628 
629 	/*
630 	 * Calculate timeout, if it was specified.
631 	 */
632 	if (SCARG(uap, timeout)) {
633 		uint64_t ms;
634 
635 		if ((error = (*fetch_timeout)(SCARG(uap, timeout), &ts, sizeof(ts))))
636 			return (error);
637 
638 		ms = (ts.tv_sec * 1000) + (ts.tv_nsec / 1000000);
639 		timo = mstohz(ms);
640 		if (timo == 0 && ts.tv_sec == 0 && ts.tv_nsec > 0)
641 			timo = 1;
642 		if (timo <= 0)
643 			return (EAGAIN);
644 
645 		/*
646 		 * Remember current uptime, it would be used in
647 		 * ECANCELED/ERESTART case.
648 		 */
649 		getnanouptime(&tsstart);
650 	}
651 
652 	error = copyin(SCARG(uap, set), &l->l_sigwaitset,
653 	    sizeof(l->l_sigwaitset));
654 	if (error != 0)
655 		return (error);
656 
657 	/*
658 	 * Silently ignore SA_CANTMASK signals. psignal1() would ignore
659 	 * SA_CANTMASK signals in waitset, we do this only for the below
660 	 * siglist check.
661 	 */
662 	sigminusset(&sigcantmask, &l->l_sigwaitset);
663 
664 	/*
665 	 * Allocate a ksi up front.  We can't sleep with the mutex held.
666 	 */
667 	ksi = ksiginfo_alloc(p, NULL, PR_WAITOK);
668 	if (ksi == NULL)
669 		return (ENOMEM);
670 
671 	mutex_enter(p->p_lock);
672 
673 	/*
674 	 * SA processes can have no more than 1 sigwaiter.
675 	 */
676 	if ((p->p_sflag & PS_SA) != 0 && !LIST_EMPTY(&p->p_sigwaiters)) {
677 		mutex_exit(p->p_lock);
678 		error = EINVAL;
679 		goto out;
680 	}
681 
682 	if ((signum = sigget(&p->p_sigpend, ksi, 0, &l->l_sigwaitset)) == 0)
683 		signum = sigget(&l->l_sigpend, ksi, 0, &l->l_sigwaitset);
684 
685 	if (signum != 0) {
686 		/*
687 		 * We found a pending signal - copy it out to the user.
688 		 */
689 		mutex_exit(p->p_lock);
690 		goto out;
691 	}
692 
693 	/*
694 	 * Set up the sigwait list.
695 	 */
696 	l->l_sigwaited = ksi;
697 	LIST_INSERT_HEAD(&p->p_sigwaiters, l, l_sigwaiter);
698 
699 	/*
700 	 * Wait for signal to arrive. We can either be woken up or time out.
701 	 */
702 	error = cv_timedwait_sig(&l->l_sigcv, p->p_lock, timo);
703 
704 	/*
705 	 * Need to find out if we woke as a result of lwp_wakeup() or a
706 	 * signal outside our wait set.
707 	 */
708 	if (l->l_sigwaited != NULL) {
709 		if (error == EINTR) {
710 			/* wakeup via _lwp_wakeup() */
711 			error = ECANCELED;
712 		} else if (!error) {
713 			/* spurious wakeup - arrange for syscall restart */
714 			error = ERESTART;
715 		}
716 		l->l_sigwaited = NULL;
717 		LIST_REMOVE(l, l_sigwaiter);
718 	}
719 
720 	mutex_exit(p->p_lock);
721 
722 	/*
723 	 * If the sleep was interrupted (either by signal or wakeup), update
724 	 * the timeout and copyout new value back.  It would be used when
725 	 * the syscall would be restarted or called again.
726 	 */
727 	if (timo && (error == ERESTART || error == ECANCELED)) {
728 		getnanouptime(&tsnow);
729 
730 		/* compute how much time has passed since start */
731 		timespecsub(&tsnow, &tsstart, &tsnow);
732 		/* substract passed time from timeout */
733 		timespecsub(&ts, &tsnow, &ts);
734 
735 		if (ts.tv_sec < 0)
736 			error = EAGAIN;
737 		else {
738 			/* copy updated timeout to userland */
739 			error = (*put_timeout)(&ts, SCARG(uap, timeout),
740 			    sizeof(ts));
741 		}
742 	}
743 
744 	/*
745 	 * If a signal from the wait set arrived, copy it to userland.
746 	 * Copy only the used part of siginfo, the padding part is
747 	 * left unchanged (userland is not supposed to touch it anyway).
748 	 */
749  out:
750 	if (error == 0)
751 		error = (*put_info)(&ksi->ksi_info, SCARG(uap, info),
752 		    sizeof(ksi->ksi_info));
753 
754 	ksiginfo_free(ksi);
755 
756 	return error;
757 }
758