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