123374Smckusick /* 247540Skarels * Copyright (c) 1982, 1986, 1989, 1991 Regents of the University of California. 337580Smckusick * All rights reserved. 423374Smckusick * 544440Sbostic * %sccs.include.redist.c% 637580Smckusick * 7*52400Storek * @(#)kern_sig.c 7.42 (Berkeley) 02/05/92 823374Smckusick */ 97421Sroot 1047540Skarels #define SIGPROP /* include signal properties table */ 1117092Sbloom #include "param.h" 1247650Skarels #include "signalvar.h" 1347650Skarels #include "resourcevar.h" 1448020Smckusick #include "namei.h" 1537580Smckusick #include "vnode.h" 1617092Sbloom #include "proc.h" 1747540Skarels #include "systm.h" 1817092Sbloom #include "timeb.h" 1917092Sbloom #include "times.h" 2017092Sbloom #include "buf.h" 2117092Sbloom #include "acct.h" 2237580Smckusick #include "file.h" 2317092Sbloom #include "kernel.h" 2439513Skarels #include "wait.h" 2540807Smarc #include "ktrace.h" 267421Sroot 2749102Skarels #include "machine/cpu.h" 2849102Skarels 2947650Skarels #include "vm/vm.h" 3047650Skarels #include "kinfo_proc.h" 3147650Skarels #include "user.h" /* for coredump */ 3237581Smckusick 3317013Smckusick /* 3447540Skarels * Can process p, with pcred pc, send the signal signo to process q? 3517013Smckusick */ 3647540Skarels #define CANSIGNAL(p, pc, q, signo) \ 3747540Skarels ((pc)->pc_ucred->cr_uid == 0 || \ 3847540Skarels (pc)->p_ruid == (q)->p_cred->p_ruid || \ 3947540Skarels (pc)->pc_ucred->cr_uid == (q)->p_cred->p_ruid || \ 4047540Skarels (pc)->p_ruid == (q)->p_ucred->cr_uid || \ 4147540Skarels (pc)->pc_ucred->cr_uid == (q)->p_ucred->cr_uid || \ 4242920Skarels ((signo) == SIGCONT && (q)->p_session == (p)->p_session)) 4339513Skarels 4442920Skarels /* ARGSUSED */ 4542920Skarels sigaction(p, uap, retval) 4642920Skarels struct proc *p; 4742920Skarels register struct args { 4812882Ssam int signo; 4939513Skarels struct sigaction *nsa; 5039513Skarels struct sigaction *osa; 5142920Skarels } *uap; 5242920Skarels int *retval; 5342920Skarels { 5439513Skarels struct sigaction vec; 5539513Skarels register struct sigaction *sa; 5647540Skarels register struct sigacts *ps = p->p_sigacts; 5712882Ssam register int sig; 5839513Skarels int bit, error; 597421Sroot 6012882Ssam sig = uap->signo; 6139513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 6244405Skarels return (EINVAL); 6339513Skarels sa = &vec; 6439513Skarels if (uap->osa) { 6547540Skarels sa->sa_handler = ps->ps_sigact[sig]; 6647540Skarels sa->sa_mask = ps->ps_catchmask[sig]; 6718308Smckusick bit = sigmask(sig); 6839513Skarels sa->sa_flags = 0; 6947540Skarels if ((ps->ps_sigonstack & bit) != 0) 7039513Skarels sa->sa_flags |= SA_ONSTACK; 7147540Skarels if ((ps->ps_sigintr & bit) == 0) 7239513Skarels sa->sa_flags |= SA_RESTART; 7342920Skarels if (p->p_flag & SNOCLDSTOP) 7439513Skarels sa->sa_flags |= SA_NOCLDSTOP; 7539513Skarels if (error = copyout((caddr_t)sa, (caddr_t)uap->osa, 7639513Skarels sizeof (vec))) 7744405Skarels return (error); 7812951Ssam } 7939513Skarels if (uap->nsa) { 8039513Skarels if (error = copyin((caddr_t)uap->nsa, (caddr_t)sa, 8139513Skarels sizeof (vec))) 8244405Skarels return (error); 8342920Skarels setsigvec(p, sig, sa); 8412951Ssam } 8544405Skarels return (0); 867421Sroot } 877421Sroot 8842920Skarels setsigvec(p, sig, sa) 8942920Skarels register struct proc *p; 9012951Ssam int sig; 9139513Skarels register struct sigaction *sa; 9212882Ssam { 9347540Skarels register struct sigacts *ps = p->p_sigacts; 9412951Ssam register int bit; 9512882Ssam 9617153Sbloom bit = sigmask(sig); 9712882Ssam /* 9812882Ssam * Change setting atomically. 9912882Ssam */ 10017153Sbloom (void) splhigh(); 10147540Skarels ps->ps_sigact[sig] = sa->sa_handler; 10247540Skarels ps->ps_catchmask[sig] = sa->sa_mask &~ sigcantmask; 10339513Skarels if ((sa->sa_flags & SA_RESTART) == 0) 10447540Skarels ps->ps_sigintr |= bit; 10518308Smckusick else 10647540Skarels ps->ps_sigintr &= ~bit; 10739513Skarels if (sa->sa_flags & SA_ONSTACK) 10847540Skarels ps->ps_sigonstack |= bit; 10912951Ssam else 11047540Skarels ps->ps_sigonstack &= ~bit; 111*52400Storek #ifdef COMPAT_SUNOS 112*52400Storek if (sa->sa_flags & SA_USERTRAMP) 113*52400Storek ps->ps_usertramp |= bit; 114*52400Storek else 115*52400Storek ps->ps_usertramp &= ~bit; 116*52400Storek #endif 11739513Skarels if (sig == SIGCHLD) { 11839513Skarels if (sa->sa_flags & SA_NOCLDSTOP) 11939513Skarels p->p_flag |= SNOCLDSTOP; 12039513Skarels else 12139513Skarels p->p_flag &= ~SNOCLDSTOP; 12239513Skarels } 12339513Skarels /* 12439513Skarels * Set bit in p_sigignore for signals that are set to SIG_IGN, 12539513Skarels * and for signals set to SIG_DFL where the default is to ignore. 12639513Skarels * However, don't put SIGCONT in p_sigignore, 12739513Skarels * as we have to restart the process. 12839513Skarels */ 12939513Skarels if (sa->sa_handler == SIG_IGN || 13047540Skarels (sigprop[sig] & SA_IGNORE && sa->sa_handler == SIG_DFL)) { 13112951Ssam p->p_sig &= ~bit; /* never to be seen again */ 13239513Skarels if (sig != SIGCONT) 13339513Skarels p->p_sigignore |= bit; /* easier in psignal */ 13412951Ssam p->p_sigcatch &= ~bit; 13512882Ssam } else { 13612951Ssam p->p_sigignore &= ~bit; 13739513Skarels if (sa->sa_handler == SIG_DFL) 13812951Ssam p->p_sigcatch &= ~bit; 13912882Ssam else 14012951Ssam p->p_sigcatch |= bit; 14112882Ssam } 14212882Ssam (void) spl0(); 14312882Ssam } 14412882Ssam 14539513Skarels /* 14639513Skarels * Initialize signal state for process 0; 14739513Skarels * set to ignore signals that are ignored by default. 14839513Skarels */ 14947540Skarels void 15039513Skarels siginit(p) 15139513Skarels struct proc *p; 1527421Sroot { 15347540Skarels register int i; 15439513Skarels 15547540Skarels for (i = 0; i < NSIG; i++) 15647540Skarels if (sigprop[i] & SA_IGNORE && i != SIGCONT) 15747540Skarels p->p_sigignore |= sigmask(i); 15839513Skarels } 15939513Skarels 16039513Skarels /* 16139513Skarels * Reset signals for an exec of the specified process. 16239513Skarels */ 16347540Skarels void 16439513Skarels execsigs(p) 16539513Skarels register struct proc *p; 16639513Skarels { 16747540Skarels register struct sigacts *ps = p->p_sigacts; 16839513Skarels register int nc, mask; 16939513Skarels 17039513Skarels /* 17139513Skarels * Reset caught signals. Held signals remain held 17239513Skarels * through p_sigmask (unless they were caught, 17339513Skarels * and are now ignored by default). 17439513Skarels */ 17539513Skarels while (p->p_sigcatch) { 17639513Skarels nc = ffs((long)p->p_sigcatch); 17739513Skarels mask = sigmask(nc); 17839513Skarels p->p_sigcatch &= ~mask; 17947540Skarels if (sigprop[nc] & SA_IGNORE) { 18039513Skarels if (nc != SIGCONT) 18139513Skarels p->p_sigignore |= mask; 18239513Skarels p->p_sig &= ~mask; 18339513Skarels } 18447540Skarels ps->ps_sigact[nc] = SIG_DFL; 18539513Skarels } 18639513Skarels /* 18739513Skarels * Reset stack state to the user stack. 18839513Skarels * Clear set of signals caught on the signal stack. 18939513Skarels */ 19047540Skarels ps->ps_onstack = 0; 19147540Skarels ps->ps_sigsp = 0; 19247540Skarels ps->ps_sigonstack = 0; 19339513Skarels } 19439513Skarels 19539513Skarels /* 19639513Skarels * Manipulate signal mask. 19739513Skarels * Note that we receive new mask, not pointer, 19839513Skarels * and return old mask as return value; 19939513Skarels * the library stub does the rest. 20039513Skarels */ 20142920Skarels sigprocmask(p, uap, retval) 20242920Skarels register struct proc *p; 20342920Skarels struct args { 20439513Skarels int how; 20539513Skarels sigset_t mask; 20642920Skarels } *uap; 20742920Skarels int *retval; 20842920Skarels { 20939513Skarels int error = 0; 21039513Skarels 21142920Skarels *retval = p->p_sigmask; 21239513Skarels (void) splhigh(); 21339513Skarels 21439513Skarels switch (uap->how) { 21539513Skarels case SIG_BLOCK: 21639513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 21739513Skarels break; 21839513Skarels 21939513Skarels case SIG_UNBLOCK: 22039513Skarels p->p_sigmask &= ~uap->mask; 22139513Skarels break; 22239513Skarels 22339513Skarels case SIG_SETMASK: 22439513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 22539513Skarels break; 22639513Skarels 22739513Skarels default: 22839513Skarels error = EINVAL; 22939513Skarels break; 23039513Skarels } 23139513Skarels (void) spl0(); 23244405Skarels return (error); 23339513Skarels } 23439513Skarels 23542920Skarels /* ARGSUSED */ 23642920Skarels sigpending(p, uap, retval) 23742920Skarels struct proc *p; 23842920Skarels void *uap; 23942920Skarels int *retval; 24039513Skarels { 24139513Skarels 24242920Skarels *retval = p->p_sig; 24344405Skarels return (0); 24439513Skarels } 24539513Skarels 246*52400Storek #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 24739513Skarels /* 24839513Skarels * Generalized interface signal handler, 4.3-compatible. 24939513Skarels */ 25042920Skarels /* ARGSUSED */ 25142920Skarels osigvec(p, uap, retval) 25242920Skarels struct proc *p; 25342920Skarels register struct args { 25439513Skarels int signo; 25539513Skarels struct sigvec *nsv; 25639513Skarels struct sigvec *osv; 25742920Skarels } *uap; 25842920Skarels int *retval; 25942920Skarels { 26039513Skarels struct sigvec vec; 26147540Skarels register struct sigacts *ps = p->p_sigacts; 26239513Skarels register struct sigvec *sv; 26339513Skarels register int sig; 26439513Skarels int bit, error; 26539513Skarels 26639513Skarels sig = uap->signo; 26739513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 26844405Skarels return (EINVAL); 26939513Skarels sv = &vec; 27039513Skarels if (uap->osv) { 27147540Skarels *(sig_t *)&sv->sv_handler = ps->ps_sigact[sig]; 27247540Skarels sv->sv_mask = ps->ps_catchmask[sig]; 27339513Skarels bit = sigmask(sig); 27439513Skarels sv->sv_flags = 0; 27547540Skarels if ((ps->ps_sigonstack & bit) != 0) 27639513Skarels sv->sv_flags |= SV_ONSTACK; 27747540Skarels if ((ps->ps_sigintr & bit) != 0) 27839513Skarels sv->sv_flags |= SV_INTERRUPT; 279*52400Storek #ifndef COMPAT_SUNOS 28042920Skarels if (p->p_flag & SNOCLDSTOP) 28139513Skarels sv->sv_flags |= SA_NOCLDSTOP; 282*52400Storek #endif 28339513Skarels if (error = copyout((caddr_t)sv, (caddr_t)uap->osv, 28439513Skarels sizeof (vec))) 28544405Skarels return (error); 28639513Skarels } 28739513Skarels if (uap->nsv) { 28839513Skarels if (error = copyin((caddr_t)uap->nsv, (caddr_t)sv, 28939513Skarels sizeof (vec))) 29044405Skarels return (error); 291*52400Storek #ifdef COMPAT_SUNOS 292*52400Storek /* 293*52400Storek * SunOS uses this bit (SA_NOCLDSTOP) as SV_RESETHAND, 294*52400Storek * `reset to SIG_DFL on delivery'. We have no such 295*52400Storek * option now or ever! 296*52400Storek */ 297*52400Storek if (sv->sv_flags & SA_NOCLDSTOP) 298*52400Storek return (EINVAL); 299*52400Storek sv->sv_flags |= SA_USERTRAMP; 300*52400Storek #endif 30139513Skarels sv->sv_flags ^= SA_RESTART; /* opposite of SV_INTERRUPT */ 30242920Skarels setsigvec(p, sig, (struct sigaction *)sv); 30339513Skarels } 30444405Skarels return (0); 30539513Skarels } 30639513Skarels 30742920Skarels osigblock(p, uap, retval) 30842920Skarels register struct proc *p; 30942920Skarels struct args { 31042920Skarels int mask; 31142920Skarels } *uap; 31242920Skarels int *retval; 31339513Skarels { 3147499Sroot 31517153Sbloom (void) splhigh(); 31642920Skarels *retval = p->p_sigmask; 31739513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 31812882Ssam (void) spl0(); 31944405Skarels return (0); 3207499Sroot } 3217499Sroot 32242920Skarels osigsetmask(p, uap, retval) 32342920Skarels struct proc *p; 32442920Skarels struct args { 32542920Skarels int mask; 32642920Skarels } *uap; 32742920Skarels int *retval; 3287499Sroot { 3297499Sroot 33017153Sbloom (void) splhigh(); 33142920Skarels *retval = p->p_sigmask; 33239513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 33312882Ssam (void) spl0(); 33444405Skarels return (0); 3357499Sroot } 33639513Skarels #endif 3377499Sroot 33839513Skarels /* 33939513Skarels * Suspend process until signal, providing mask to be set 34039513Skarels * in the meantime. Note nonstandard calling convention: 34139513Skarels * libc stub passes mask, not pointer, to save a copyin. 34239513Skarels */ 34342920Skarels /* ARGSUSED */ 34442920Skarels sigsuspend(p, uap, retval) 34542920Skarels register struct proc *p; 34642920Skarels struct args { 34742920Skarels sigset_t mask; 34842920Skarels } *uap; 34942920Skarels int *retval; 3507499Sroot { 35147540Skarels register struct sigacts *ps = p->p_sigacts; 3527499Sroot 35312882Ssam /* 35412882Ssam * When returning from sigpause, we want 35512882Ssam * the old mask to be restored after the 35612882Ssam * signal handler has finished. Thus, we 35752115Skarels * save it here and mark the sigacts structure 35852115Skarels * to indicate this. 35912882Ssam */ 36047540Skarels ps->ps_oldmask = p->p_sigmask; 36147540Skarels ps->ps_flags |= SA_OLDMASK; 36239513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 36347540Skarels (void) tsleep((caddr_t) ps, PPAUSE|PCATCH, "pause", 0); 36440807Smarc /* always return EINTR rather than ERESTART... */ 36544405Skarels return (EINTR); 3667499Sroot } 3677499Sroot 36842920Skarels /* ARGSUSED */ 36942920Skarels sigstack(p, uap, retval) 37042920Skarels struct proc *p; 37142920Skarels register struct args { 37212951Ssam struct sigstack *nss; 37312951Ssam struct sigstack *oss; 37442920Skarels } *uap; 37542920Skarels int *retval; 37642920Skarels { 37712951Ssam struct sigstack ss; 37839513Skarels int error = 0; 3797499Sroot 38047540Skarels if (uap->oss && (error = copyout((caddr_t)&p->p_sigacts->ps_sigstack, 38139513Skarels (caddr_t)uap->oss, sizeof (struct sigstack)))) 38244405Skarels return (error); 38339513Skarels if (uap->nss && (error = copyin((caddr_t)uap->nss, (caddr_t)&ss, 38439513Skarels sizeof (ss))) == 0) 38547540Skarels p->p_sigacts->ps_sigstack = ss; 38644405Skarels return (error); 3877499Sroot } 3887499Sroot 38942920Skarels /* ARGSUSED */ 39042920Skarels kill(cp, uap, retval) 39142920Skarels register struct proc *cp; 39242920Skarels register struct args { 39312882Ssam int pid; 39412882Ssam int signo; 39542920Skarels } *uap; 39642920Skarels int *retval; 39742920Skarels { 39818336Smckusick register struct proc *p; 39947540Skarels register struct pcred *pc = cp->p_cred; 4008032Sroot 40139513Skarels if ((unsigned) uap->signo >= NSIG) 40244405Skarels return (EINVAL); 40318336Smckusick if (uap->pid > 0) { 40418336Smckusick /* kill single process */ 40518336Smckusick p = pfind(uap->pid); 40639513Skarels if (p == 0) 40744405Skarels return (ESRCH); 40847540Skarels if (!CANSIGNAL(cp, pc, p, uap->signo)) 40944405Skarels return (EPERM); 41039513Skarels if (uap->signo) 41118336Smckusick psignal(p, uap->signo); 41244405Skarels return (0); 41318336Smckusick } 41418336Smckusick switch (uap->pid) { 41518336Smckusick case -1: /* broadcast signal */ 41644405Skarels return (killpg1(cp, uap->signo, 0, 1)); 41718336Smckusick case 0: /* signal own process group */ 41844405Skarels return (killpg1(cp, uap->signo, 0, 0)); 41918336Smckusick default: /* negative explicit process group */ 42044405Skarels return (killpg1(cp, uap->signo, -uap->pid, 0)); 42118336Smckusick } 42239513Skarels /* NOTREACHED */ 4238032Sroot } 4248032Sroot 425*52400Storek #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 42642920Skarels /* ARGSUSED */ 42742920Skarels okillpg(p, uap, retval) 42842920Skarels struct proc *p; 42942920Skarels register struct args { 43037581Smckusick int pgid; 4319989Ssam int signo; 43242920Skarels } *uap; 43342920Skarels int *retval; 43442920Skarels { 4358032Sroot 43639513Skarels if ((unsigned) uap->signo >= NSIG) 43744405Skarels return (EINVAL); 43844405Skarels return (killpg1(p, uap->signo, uap->pgid, 0)); 4398032Sroot } 44039513Skarels #endif 4418032Sroot 44242920Skarels /* 44342920Skarels * Common code for kill process group/broadcast kill. 44442920Skarels * cp is calling process. 44542920Skarels */ 44642920Skarels killpg1(cp, signo, pgid, all) 44742920Skarels register struct proc *cp; 44837581Smckusick int signo, pgid, all; 4499989Ssam { 4509989Ssam register struct proc *p; 45147540Skarels register struct pcred *pc = cp->p_cred; 45237581Smckusick struct pgrp *pgrp; 45347540Skarels int nfound = 0; 45437581Smckusick 45537581Smckusick if (all) 45637581Smckusick /* 45737581Smckusick * broadcast 4587421Sroot */ 45937581Smckusick for (p = allproc; p != NULL; p = p->p_nxt) { 46047540Skarels if (p->p_pid <= 1 || p->p_flag&SSYS || 46147540Skarels p == cp || !CANSIGNAL(cp, pc, p, signo)) 46237581Smckusick continue; 46347540Skarels nfound++; 46437581Smckusick if (signo) 46537581Smckusick psignal(p, signo); 46637581Smckusick } 46737581Smckusick else { 46837581Smckusick if (pgid == 0) 46937581Smckusick /* 47037581Smckusick * zero pgid means send to my process group. 47137581Smckusick */ 47247540Skarels pgrp = cp->p_pgrp; 47337581Smckusick else { 47437581Smckusick pgrp = pgfind(pgid); 47537581Smckusick if (pgrp == NULL) 47639513Skarels return (ESRCH); 47737581Smckusick } 47837581Smckusick for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) { 47947540Skarels if (p->p_pid <= 1 || p->p_flag&SSYS || 48050128Skarels p->p_stat == SZOMB || !CANSIGNAL(cp, pc, p, signo)) 48137581Smckusick continue; 48247540Skarels nfound++; 48337581Smckusick if (signo) 48437581Smckusick psignal(p, signo); 48518336Smckusick } 4867421Sroot } 48747540Skarels return (nfound ? 0 : ESRCH); 4887421Sroot } 4897421Sroot 49042920Skarels /* 4917421Sroot * Send the specified signal to 49237581Smckusick * all processes with 'pgid' as 4937421Sroot * process group. 4947421Sroot */ 49547540Skarels void 49637581Smckusick gsignal(pgid, sig) 49747540Skarels int pgid, sig; 4987421Sroot { 49939513Skarels struct pgrp *pgrp; 5007421Sroot 50139513Skarels if (pgid && (pgrp = pgfind(pgid))) 50242207Smarc pgsignal(pgrp, sig, 0); 5037421Sroot } 50442920Skarels 50540807Smarc /* 50642207Smarc * Send sig to every member of a process group. 50742207Smarc * If checktty is 1, limit to members which have a controlling 50842207Smarc * terminal. 50940807Smarc */ 51047540Skarels void 51142207Smarc pgsignal(pgrp, sig, checkctty) 51239513Skarels struct pgrp *pgrp; 51347540Skarels int sig, checkctty; 51437581Smckusick { 51537581Smckusick register struct proc *p; 51637581Smckusick 51740807Smarc if (pgrp) 51840807Smarc for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) 51942207Smarc if (checkctty == 0 || p->p_flag&SCTTY) 52042207Smarc psignal(p, sig); 52137581Smckusick } 52237581Smckusick 5237421Sroot /* 52439513Skarels * Send a signal caused by a trap to the current process. 52539513Skarels * If it will be caught immediately, deliver it with correct code. 52639513Skarels * Otherwise, post it normally. 52739513Skarels */ 52847540Skarels void 52947540Skarels trapsignal(p, sig, code) 53047540Skarels struct proc *p; 53139513Skarels register int sig; 53239513Skarels unsigned code; 53339513Skarels { 53447540Skarels register struct sigacts *ps = p->p_sigacts; 53539513Skarels int mask; 53639513Skarels 53739513Skarels mask = sigmask(sig); 53839513Skarels if ((p->p_flag & STRC) == 0 && (p->p_sigcatch & mask) != 0 && 53939513Skarels (p->p_sigmask & mask) == 0) { 54047540Skarels p->p_stats->p_ru.ru_nsignals++; 54140807Smarc #ifdef KTRACE 54240807Smarc if (KTRPOINT(p, KTR_PSIG)) 54347540Skarels ktrpsig(p->p_tracep, sig, ps->ps_sigact[sig], 54440807Smarc p->p_sigmask, code); 54540807Smarc #endif 54647540Skarels sendsig(ps->ps_sigact[sig], sig, p->p_sigmask, code); 54747540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 54839513Skarels } else { 54947540Skarels ps->ps_code = code; /* XXX for core dump/debugger */ 55039513Skarels psignal(p, sig); 55139513Skarels } 55239513Skarels } 55339513Skarels 55439513Skarels /* 55540807Smarc * Send the specified signal to the specified process. 55647540Skarels * If the signal has an action, the action is usually performed 55747540Skarels * by the target process rather than the caller; we simply add 55847540Skarels * the signal to the set of pending signals for the process. 55940807Smarc * Exceptions: 56040807Smarc * o When a stop signal is sent to a sleeping process that takes the default 56140807Smarc * action, the process is stopped without awakening it. 56240807Smarc * o SIGCONT restarts stopped processes (or puts them back to sleep) 56340807Smarc * regardless of the signal action (eg, blocked or ignored). 56440807Smarc * Other ignored signals are discarded immediately. 5657421Sroot */ 56647540Skarels void 5677421Sroot psignal(p, sig) 5687421Sroot register struct proc *p; 5697421Sroot register int sig; 5707421Sroot { 57147540Skarels register int s, prop; 57239513Skarels register sig_t action; 57317153Sbloom int mask; 5747421Sroot 57539513Skarels if ((unsigned)sig >= NSIG || sig == 0) 57639513Skarels panic("psignal sig"); 57717153Sbloom mask = sigmask(sig); 57847540Skarels prop = sigprop[sig]; 5797421Sroot 5807421Sroot /* 5817421Sroot * If proc is traced, always give parent a chance. 5827421Sroot */ 5837421Sroot if (p->p_flag & STRC) 5847421Sroot action = SIG_DFL; 5857421Sroot else { 5867421Sroot /* 58712882Ssam * If the signal is being ignored, 58812882Ssam * then we forget about it immediately. 58939513Skarels * (Note: we don't set SIGCONT in p_sigignore, 59039513Skarels * and if it is set to SIG_IGN, 59139513Skarels * action will be SIG_DFL here.) 5927421Sroot */ 59317153Sbloom if (p->p_sigignore & mask) 5947421Sroot return; 59517153Sbloom if (p->p_sigmask & mask) 59612882Ssam action = SIG_HOLD; 59717153Sbloom else if (p->p_sigcatch & mask) 59812882Ssam action = SIG_CATCH; 59942437Skarels else 60012882Ssam action = SIG_DFL; 6017421Sroot } 6027421Sroot 60347540Skarels if (p->p_nice > NZERO && (sig == SIGKILL || 60447540Skarels sig == SIGTERM && (p->p_flag&STRC || action != SIG_DFL))) 60547540Skarels p->p_nice = NZERO; 6067421Sroot 60747540Skarels if (prop & SA_CONT) 60839513Skarels p->p_sig &= ~stopsigmask; 60939513Skarels 61047540Skarels if (prop & SA_STOP) { 61145672Skarels /* 61245672Skarels * If sending a tty stop signal to a member of an orphaned 61345672Skarels * process group, discard the signal here if the action 61445672Skarels * is default; don't stop the process below if sleeping, 61545672Skarels * and don't clear any pending SIGCONT. 61645672Skarels */ 61747540Skarels if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0 && 61847540Skarels action == SIG_DFL) 61945741Smckusick return; 62047540Skarels p->p_sig &= ~contsigmask; 6217421Sroot } 62239513Skarels p->p_sig |= mask; 62339513Skarels 6247421Sroot /* 62539513Skarels * Defer further processing for signals which are held, 62639513Skarels * except that stopped processes must be continued by SIGCONT. 6277421Sroot */ 62847540Skarels if (action == SIG_HOLD && ((prop & SA_CONT) == 0 || p->p_stat != SSTOP)) 6297421Sroot return; 63017153Sbloom s = splhigh(); 6317421Sroot switch (p->p_stat) { 6327421Sroot 6337421Sroot case SSLEEP: 6347421Sroot /* 63540807Smarc * If process is sleeping uninterruptibly 6367421Sroot * we can't interrupt the sleep... the signal will 6377421Sroot * be noticed when the process returns through 6387421Sroot * trap() or syscall(). 6397421Sroot */ 64040807Smarc if ((p->p_flag & SSINTR) == 0) 6417421Sroot goto out; 6427421Sroot /* 6437421Sroot * Process is sleeping and traced... make it runnable 6447421Sroot * so it can discover the signal in issig() and stop 6457421Sroot * for the parent. 6467421Sroot */ 6477421Sroot if (p->p_flag&STRC) 6487421Sroot goto run; 64939513Skarels /* 65039513Skarels * When a sleeping process receives a stop 65139513Skarels * signal, process immediately if possible. 65239513Skarels * All other (caught or default) signals 65339513Skarels * cause the process to run. 65439513Skarels */ 65547540Skarels if (prop & SA_STOP) { 6567421Sroot if (action != SIG_DFL) 65739513Skarels goto runfast; 6587421Sroot /* 65947540Skarels * If a child holding parent blocked, 66047540Skarels * stopping could cause deadlock. 6617421Sroot */ 66247540Skarels if (p->p_flag&SPPWAIT) 6637421Sroot goto out; 66417153Sbloom p->p_sig &= ~mask; 66543895Skarels p->p_xstat = sig; 66639513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 66739513Skarels psignal(p->p_pptr, SIGCHLD); 6687421Sroot stop(p); 6697421Sroot goto out; 67039513Skarels } else 67139513Skarels goto runfast; 6727421Sroot /*NOTREACHED*/ 6737421Sroot 6747421Sroot case SSTOP: 6757421Sroot /* 6767421Sroot * If traced process is already stopped, 6777421Sroot * then no further action is necessary. 6787421Sroot */ 6797421Sroot if (p->p_flag&STRC) 6807421Sroot goto out; 6817421Sroot 68247540Skarels /* 68347540Skarels * Kill signal always sets processes running. 68447540Skarels */ 68547540Skarels if (sig == SIGKILL) 68639513Skarels goto runfast; 6877421Sroot 68847540Skarels if (prop & SA_CONT) { 6897421Sroot /* 69039513Skarels * If SIGCONT is default (or ignored), we continue 69139513Skarels * the process but don't leave the signal in p_sig, 69239513Skarels * as it has no further action. If SIGCONT is held, 69339513Skarels * continue the process and leave the signal in p_sig. 6947421Sroot * If the process catches SIGCONT, let it handle 6957421Sroot * the signal itself. If it isn't waiting on 6967421Sroot * an event, then it goes back to run state. 6977421Sroot * Otherwise, process goes back to sleep state. 6987421Sroot */ 69939513Skarels if (action == SIG_DFL) 70039513Skarels p->p_sig &= ~mask; 70139513Skarels if (action == SIG_CATCH) 70239513Skarels goto runfast; 70339513Skarels if (p->p_wchan == 0) 7047421Sroot goto run; 7057421Sroot p->p_stat = SSLEEP; 7067421Sroot goto out; 70747540Skarels } 7087421Sroot 70947540Skarels if (prop & SA_STOP) { 7107421Sroot /* 7117421Sroot * Already stopped, don't need to stop again. 7127421Sroot * (If we did the shell could get confused.) 7137421Sroot */ 71417153Sbloom p->p_sig &= ~mask; /* take it away */ 7157421Sroot goto out; 7167421Sroot } 7177421Sroot 71847540Skarels /* 71947540Skarels * If process is sleeping interruptibly, then 72047540Skarels * simulate a wakeup so that when it is continued, 72147540Skarels * it will be made runnable and can look at the signal. 72247540Skarels * But don't setrun the process, leave it stopped. 72347540Skarels */ 72447540Skarels if (p->p_wchan && p->p_flag & SSINTR) 72547540Skarels unsleep(p); 72647540Skarels goto out; 72747540Skarels 7287421Sroot default: 7297421Sroot /* 7307421Sroot * SRUN, SIDL, SZOMB do nothing with the signal, 7317421Sroot * other than kicking ourselves if we are running. 7327421Sroot * It will either never be noticed, or noticed very soon. 7337421Sroot */ 73447650Skarels if (p == curproc) 73549102Skarels signotify(p); 7367421Sroot goto out; 7377421Sroot } 7387421Sroot /*NOTREACHED*/ 73939513Skarels 74039513Skarels runfast: 7417421Sroot /* 7427421Sroot * Raise priority to at least PUSER. 7437421Sroot */ 7447421Sroot if (p->p_pri > PUSER) 74517399Skarels p->p_pri = PUSER; 74639513Skarels run: 7477421Sroot setrun(p); 7487421Sroot out: 7497421Sroot splx(s); 7507421Sroot } 7517421Sroot 7527421Sroot /* 75340807Smarc * If the current process has a signal to process (should be caught 75440807Smarc * or cause termination, should interrupt current syscall), 75540807Smarc * return the signal number. Stop signals with default action 75640807Smarc * are processed immediately, then cleared; they aren't returned. 75747540Skarels * This is checked after each entry to the system for a syscall 75847540Skarels * or trap (though this can usually be done without actually calling 75947540Skarels * issig by checking the pending signal masks in the CURSIG macro.) 76047540Skarels * The normal call sequence is 76147540Skarels * 76247540Skarels * while (sig = CURSIG(curproc)) 76347540Skarels * psig(sig); 7647421Sroot */ 76547540Skarels issig(p) 76647540Skarels register struct proc *p; 7677421Sroot { 76847540Skarels register int sig, mask, prop; 7697421Sroot 7707421Sroot for (;;) { 77139513Skarels mask = p->p_sig &~ p->p_sigmask; 77247540Skarels if (p->p_flag&SPPWAIT) 77339513Skarels mask &= ~stopsigmask; 77440807Smarc if (mask == 0) /* no signal to send */ 77540807Smarc return (0); 77639513Skarels sig = ffs((long)mask); 77717153Sbloom mask = sigmask(sig); 77847540Skarels prop = sigprop[sig]; 77940807Smarc /* 78040807Smarc * We should see pending but ignored signals 78140807Smarc * only if STRC was on when they were posted. 78240807Smarc */ 78340807Smarc if (mask & p->p_sigignore && (p->p_flag&STRC) == 0) { 78440807Smarc p->p_sig &= ~mask; 78540807Smarc continue; 78640807Smarc } 78747540Skarels if (p->p_flag&STRC && (p->p_flag&SPPWAIT) == 0) { 7887421Sroot /* 7897421Sroot * If traced, always stop, and stay 7907421Sroot * stopped until released by the parent. 7917421Sroot */ 79243895Skarels p->p_xstat = sig; 79318331Skarels psignal(p->p_pptr, SIGCHLD); 7947421Sroot do { 7957421Sroot stop(p); 7967421Sroot swtch(); 79742926Smckusick } while (!procxmt(p) && p->p_flag&STRC); 7987421Sroot 7997421Sroot /* 80014782Ssam * If the traced bit got turned off, 80140807Smarc * go back up to the top to rescan signals. 80247650Skarels * This ensures that p_sig* and ps_sigact 80347650Skarels * are consistent. 8047421Sroot */ 80540807Smarc if ((p->p_flag&STRC) == 0) 8067421Sroot continue; 8077421Sroot 8087421Sroot /* 8097421Sroot * If parent wants us to take the signal, 81043895Skarels * then it will leave it in p->p_xstat; 8117421Sroot * otherwise we just look for signals again. 8127421Sroot */ 81340807Smarc p->p_sig &= ~mask; /* clear the old signal */ 81443895Skarels sig = p->p_xstat; 8157421Sroot if (sig == 0) 8167421Sroot continue; 81714782Ssam 81814782Ssam /* 81940807Smarc * Put the new signal into p_sig. 82040807Smarc * If signal is being masked, 82140807Smarc * look for other signals. 82214782Ssam */ 82317153Sbloom mask = sigmask(sig); 82440807Smarc p->p_sig |= mask; 82540807Smarc if (p->p_sigmask & mask) 82614782Ssam continue; 8277421Sroot } 82840807Smarc 82940807Smarc /* 83040807Smarc * Decide whether the signal should be returned. 83140807Smarc * Return the signal's number, or fall through 83240807Smarc * to clear it from the pending mask. 83340807Smarc */ 83447540Skarels switch ((int)p->p_sigacts->ps_sigact[sig]) { 8357421Sroot 8367421Sroot case SIG_DFL: 8377421Sroot /* 8387421Sroot * Don't take default actions on system processes. 8397421Sroot */ 84051019Sralph if (p->p_pid <= 1) { 84151019Sralph #ifdef DIAGNOSTIC 84251019Sralph /* 84351019Sralph * Are you sure you want to ignore SIGSEGV 84451019Sralph * in init? XXX 84551019Sralph */ 84651019Sralph printf("Process (pid %d) got signal %d\n", 84751019Sralph p->p_pid, sig); 84851019Sralph #endif 84940807Smarc break; /* == ignore */ 85051019Sralph } 85140807Smarc /* 85240807Smarc * If there is a pending stop signal to process 85340807Smarc * with default action, stop here, 85442437Skarels * then clear the signal. However, 85542437Skarels * if process is member of an orphaned 85642437Skarels * process group, ignore tty stop signals. 85740807Smarc */ 85847540Skarels if (prop & SA_STOP) { 85942437Skarels if (p->p_flag&STRC || 86042437Skarels (p->p_pgrp->pg_jobc == 0 && 86147540Skarels prop & SA_TTYSTOP)) 86240807Smarc break; /* == ignore */ 86343895Skarels p->p_xstat = sig; 8647421Sroot stop(p); 86539513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 86639513Skarels psignal(p->p_pptr, SIGCHLD); 8677421Sroot swtch(); 86840807Smarc break; 86947540Skarels } else if (prop & SA_IGNORE) { 8707421Sroot /* 87139513Skarels * Except for SIGCONT, shouldn't get here. 87239513Skarels * Default action is to ignore; drop it. 8737421Sroot */ 87440807Smarc break; /* == ignore */ 87539513Skarels } else 87640807Smarc return (sig); 8777421Sroot /*NOTREACHED*/ 8787421Sroot 8797421Sroot case SIG_IGN: 8807421Sroot /* 88139513Skarels * Masking above should prevent us ever trying 88239513Skarels * to take action on an ignored signal other 88339513Skarels * than SIGCONT, unless process is traced. 8847421Sroot */ 88547540Skarels if ((prop & SA_CONT) == 0 && (p->p_flag&STRC) == 0) 8867421Sroot printf("issig\n"); 88740807Smarc break; /* == ignore */ 8887421Sroot 8897421Sroot default: 8907421Sroot /* 8917421Sroot * This signal has an action, let 8927421Sroot * psig process it. 8937421Sroot */ 89440807Smarc return (sig); 8957421Sroot } 89640807Smarc p->p_sig &= ~mask; /* take the signal! */ 8977421Sroot } 89840807Smarc /* NOTREACHED */ 8997421Sroot } 9007421Sroot 9017421Sroot /* 9027421Sroot * Put the argument process into the stopped 90318331Skarels * state and notify the parent via wakeup. 90418331Skarels * Signals are handled elsewhere. 90540807Smarc * The process must not be on the run queue. 9067421Sroot */ 9077421Sroot stop(p) 9087421Sroot register struct proc *p; 9097421Sroot { 9107421Sroot 9117421Sroot p->p_stat = SSTOP; 9127421Sroot p->p_flag &= ~SWTED; 9137421Sroot wakeup((caddr_t)p->p_pptr); 9147421Sroot } 9157421Sroot 9167421Sroot /* 91747540Skarels * Take the action for the specified signal 91847540Skarels * from the current set of pending signals. 9197421Sroot */ 92047540Skarels void 92140807Smarc psig(sig) 92240807Smarc register int sig; 9237421Sroot { 92447540Skarels register struct proc *p = curproc; 92547540Skarels register struct sigacts *ps = p->p_sigacts; 92647540Skarels register sig_t action; 92739513Skarels int mask, returnmask; 9287421Sroot 92940807Smarc #ifdef DIAGNOSTIC 93047540Skarels if (sig == 0) 93147540Skarels panic("psig"); 93240807Smarc #endif 93347540Skarels mask = sigmask(sig); 93447540Skarels p->p_sig &= ~mask; 93547540Skarels action = ps->ps_sigact[sig]; 93640807Smarc #ifdef KTRACE 93747540Skarels if (KTRPOINT(p, KTR_PSIG)) 93847540Skarels ktrpsig(p->p_tracep, sig, action, ps->ps_flags & SA_OLDMASK ? 93947540Skarels ps->ps_oldmask : p->p_sigmask, 0); 94040807Smarc #endif 94147540Skarels if (action == SIG_DFL) { 94247540Skarels /* 94347540Skarels * Default action, where the default is to kill 94447540Skarels * the process. (Other cases were ignored above.) 94547540Skarels */ 94647650Skarels sigexit(p, sig); 94747540Skarels /* NOTREACHED */ 94847540Skarels } else { 94947540Skarels /* 95047540Skarels * If we get here, the signal must be caught. 95147540Skarels */ 95239513Skarels #ifdef DIAGNOSTIC 95347540Skarels if (action == SIG_IGN || (p->p_sigmask & mask)) 95447540Skarels panic("psig action"); 95539513Skarels #endif 95647540Skarels /* 95747540Skarels * Set the new mask value and also defer further 95847540Skarels * occurences of this signal. 95947540Skarels * 96047540Skarels * Special case: user has done a sigpause. Here the 96147540Skarels * current mask is not of interest, but rather the 96247540Skarels * mask from before the sigpause is what we want 96347540Skarels * restored after the signal processing is completed. 96447540Skarels */ 96547540Skarels (void) splhigh(); 96647540Skarels if (ps->ps_flags & SA_OLDMASK) { 96747540Skarels returnmask = ps->ps_oldmask; 96847540Skarels ps->ps_flags &= ~SA_OLDMASK; 96947540Skarels } else 97047540Skarels returnmask = p->p_sigmask; 97147540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 97247540Skarels (void) spl0(); 97347540Skarels p->p_stats->p_ru.ru_nsignals++; 97447540Skarels sendsig(action, sig, returnmask, 0); 97547540Skarels } 9767421Sroot } 9777421Sroot 9787421Sroot /* 97947650Skarels * Force the current process to exit with the specified 98047650Skarels * signal, dumping core if appropriate. We bypass the normal 98147650Skarels * tests for masked and caught signals, allowing unrecoverable 98247650Skarels * failures to terminate the process without changing signal state. 98347650Skarels * Mark the accounting record with the signal termination. 98447650Skarels * If dumping core, save the signal number for the debugger. 98547650Skarels * Calls exit and does not return. 98647650Skarels */ 98747650Skarels sigexit(p, sig) 98847650Skarels register struct proc *p; 98947650Skarels int sig; 99047650Skarels { 99147650Skarels 99247650Skarels p->p_acflag |= AXSIG; 99347650Skarels if (sigprop[sig] & SA_CORE) { 99447650Skarels p->p_sigacts->ps_sig = sig; 99547650Skarels if (coredump(p) == 0) 99647650Skarels sig |= WCOREFLAG; 99747650Skarels } 99847650Skarels exit(p, W_EXITCODE(0, sig)); 99947650Skarels /* NOTREACHED */ 100047650Skarels } 100147650Skarels 100247650Skarels /* 100347540Skarels * Create a core dump. 100450244Skarels * The file name is "core.progname". 100550099Smckusick * Core dumps are not created if the process is setuid. 10067421Sroot */ 100747540Skarels coredump(p) 100847540Skarels register struct proc *p; 10097421Sroot { 101037728Smckusick register struct vnode *vp; 101147540Skarels register struct pcred *pcred = p->p_cred; 101247540Skarels register struct ucred *cred = pcred->pc_ucred; 101347540Skarels register struct vmspace *vm = p->p_vmspace; 101437580Smckusick struct vattr vattr; 101550105Smckusick int error, error1; 101647540Skarels struct nameidata nd; 101750244Skarels char name[MAXCOMLEN+6]; /* core.progname */ 10187421Sroot 101947540Skarels if (pcred->p_svuid != pcred->p_ruid || 102047540Skarels pcred->p_svgid != pcred->p_rgid) 102137580Smckusick return (EFAULT); 102247540Skarels if (ctob(UPAGES + vm->vm_dsize + vm->vm_ssize) >= 102347540Skarels p->p_rlimit[RLIMIT_CORE].rlim_cur) 102437580Smckusick return (EFAULT); 102550244Skarels sprintf(name, "core.%s", p->p_comm); 102652304Sheideman NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, name, p); 102752304Sheideman if (error = vn_open(&nd, O_CREAT|FWRITE, 0644)) 102837580Smckusick return (error); 102947540Skarels vp = nd.ni_vp; 103048020Smckusick if (vp->v_type != VREG || VOP_GETATTR(vp, &vattr, cred, p) || 103137580Smckusick vattr.va_nlink != 1) { 103250105Smckusick error = EFAULT; 103350105Smckusick goto out; 10347818Sroot } 103541362Smckusick VATTR_NULL(&vattr); 103637580Smckusick vattr.va_size = 0; 103752183Smckusick LEASE_CHECK(vp, p, cred, LEASE_WRITE); 103848020Smckusick VOP_SETATTR(vp, &vattr, cred, p); 103947540Skarels p->p_acflag |= ACORE; 104049102Skarels bcopy(p, &p->p_addr->u_kproc.kp_proc, sizeof(struct proc)); 104149102Skarels fill_eproc(p, &p->p_addr->u_kproc.kp_eproc); 104242004Smckusick #ifdef HPUXCOMPAT 104342004Smckusick /* 104442004Smckusick * BLETCH! If we loaded from an HPUX format binary file 104542004Smckusick * we have to dump an HPUX style user struct so that the 104642004Smckusick * HPUX debuggers can grok it. 104742004Smckusick */ 104849102Skarels if (p->p_addr->u_pcb.pcb_flags & PCB_HPUXBIN) 104947540Skarels error = hpuxdumpu(vp, cred); 105042004Smckusick else 105142004Smckusick #endif 105249102Skarels error = vn_rdwr(UIO_WRITE, vp, (caddr_t) p->p_addr, ctob(UPAGES), 105349102Skarels (off_t)0, UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, 105449102Skarels p); 105537580Smckusick if (error == 0) 105647540Skarels error = vn_rdwr(UIO_WRITE, vp, vm->vm_daddr, 105747540Skarels (int)ctob(vm->vm_dsize), (off_t)ctob(UPAGES), UIO_USERSPACE, 105849102Skarels IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, p); 105937580Smckusick if (error == 0) 106037580Smckusick error = vn_rdwr(UIO_WRITE, vp, 106149102Skarels (caddr_t) trunc_page(USRSTACK - ctob(vm->vm_ssize)), 106247540Skarels round_page(ctob(vm->vm_ssize)), 106347540Skarels (off_t)ctob(UPAGES) + ctob(vm->vm_dsize), UIO_USERSPACE, 106449102Skarels IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, p); 106550105Smckusick out: 106650105Smckusick VOP_UNLOCK(vp); 106750105Smckusick error1 = vn_close(vp, FWRITE, cred, p); 106850244Skarels if (error == 0) 106950105Smckusick error = error1; 107037580Smckusick return (error); 10717421Sroot } 107239513Skarels 107339513Skarels /* 107439513Skarels * Nonexistent system call-- signal process (may want to handle it). 107539513Skarels * Flag error in case process won't see signal immediately (blocked or ignored). 107639513Skarels */ 107743364Smckusick /* ARGSUSED */ 107843364Smckusick nosys(p, args, retval) 107943364Smckusick struct proc *p; 108043364Smckusick void *args; 108143364Smckusick int *retval; 108239513Skarels { 108339513Skarels 108443364Smckusick psignal(p, SIGSYS); 108544405Skarels return (EINVAL); 108639513Skarels } 1087