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*47650Skarels * @(#)kern_sig.c 7.28 (Berkeley) 03/25/91 823374Smckusick */ 97421Sroot 1047540Skarels #define SIGPROP /* include signal properties table */ 1117092Sbloom #include "param.h" 12*47650Skarels #include "signalvar.h" 13*47650Skarels #include "resourcevar.h" 1437580Smckusick #include "vnode.h" 1517092Sbloom #include "proc.h" 1647540Skarels #include "systm.h" 1717092Sbloom #include "timeb.h" 1817092Sbloom #include "times.h" 1917092Sbloom #include "buf.h" 2017092Sbloom #include "seg.h" 2117092Sbloom #include "acct.h" 2237580Smckusick #include "file.h" 2317092Sbloom #include "kernel.h" 2439513Skarels #include "wait.h" 2540807Smarc #include "ktrace.h" 267421Sroot 27*47650Skarels #include "vm/vm.h" 28*47650Skarels #include "kinfo_proc.h" 29*47650Skarels #include "user.h" /* for coredump */ 3037581Smckusick 3117013Smckusick /* 3247540Skarels * Can process p, with pcred pc, send the signal signo to process q? 3317013Smckusick */ 3447540Skarels #define CANSIGNAL(p, pc, q, signo) \ 3547540Skarels ((pc)->pc_ucred->cr_uid == 0 || \ 3647540Skarels (pc)->p_ruid == (q)->p_cred->p_ruid || \ 3747540Skarels (pc)->pc_ucred->cr_uid == (q)->p_cred->p_ruid || \ 3847540Skarels (pc)->p_ruid == (q)->p_ucred->cr_uid || \ 3947540Skarels (pc)->pc_ucred->cr_uid == (q)->p_ucred->cr_uid || \ 4042920Skarels ((signo) == SIGCONT && (q)->p_session == (p)->p_session)) 4139513Skarels 4242920Skarels /* ARGSUSED */ 4342920Skarels sigaction(p, uap, retval) 4442920Skarels struct proc *p; 4542920Skarels register struct args { 4612882Ssam int signo; 4739513Skarels struct sigaction *nsa; 4839513Skarels struct sigaction *osa; 4942920Skarels } *uap; 5042920Skarels int *retval; 5142920Skarels { 5239513Skarels struct sigaction vec; 5339513Skarels register struct sigaction *sa; 5447540Skarels register struct sigacts *ps = p->p_sigacts; 5512882Ssam register int sig; 5639513Skarels int bit, error; 577421Sroot 5812882Ssam sig = uap->signo; 5939513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 6044405Skarels return (EINVAL); 6139513Skarels sa = &vec; 6239513Skarels if (uap->osa) { 6347540Skarels sa->sa_handler = ps->ps_sigact[sig]; 6447540Skarels sa->sa_mask = ps->ps_catchmask[sig]; 6518308Smckusick bit = sigmask(sig); 6639513Skarels sa->sa_flags = 0; 6747540Skarels if ((ps->ps_sigonstack & bit) != 0) 6839513Skarels sa->sa_flags |= SA_ONSTACK; 6947540Skarels if ((ps->ps_sigintr & bit) == 0) 7039513Skarels sa->sa_flags |= SA_RESTART; 7142920Skarels if (p->p_flag & SNOCLDSTOP) 7239513Skarels sa->sa_flags |= SA_NOCLDSTOP; 7339513Skarels if (error = copyout((caddr_t)sa, (caddr_t)uap->osa, 7439513Skarels sizeof (vec))) 7544405Skarels return (error); 7612951Ssam } 7739513Skarels if (uap->nsa) { 7839513Skarels if (error = copyin((caddr_t)uap->nsa, (caddr_t)sa, 7939513Skarels sizeof (vec))) 8044405Skarels return (error); 8142920Skarels setsigvec(p, sig, sa); 8212951Ssam } 8344405Skarels return (0); 847421Sroot } 857421Sroot 8642920Skarels setsigvec(p, sig, sa) 8742920Skarels register struct proc *p; 8812951Ssam int sig; 8939513Skarels register struct sigaction *sa; 9012882Ssam { 9147540Skarels register struct sigacts *ps = p->p_sigacts; 9212951Ssam register int bit; 9312882Ssam 9417153Sbloom bit = sigmask(sig); 9512882Ssam /* 9612882Ssam * Change setting atomically. 9712882Ssam */ 9817153Sbloom (void) splhigh(); 9947540Skarels ps->ps_sigact[sig] = sa->sa_handler; 10047540Skarels ps->ps_catchmask[sig] = sa->sa_mask &~ sigcantmask; 10139513Skarels if ((sa->sa_flags & SA_RESTART) == 0) 10247540Skarels ps->ps_sigintr |= bit; 10318308Smckusick else 10447540Skarels ps->ps_sigintr &= ~bit; 10539513Skarels if (sa->sa_flags & SA_ONSTACK) 10647540Skarels ps->ps_sigonstack |= bit; 10712951Ssam else 10847540Skarels ps->ps_sigonstack &= ~bit; 10939513Skarels if (sig == SIGCHLD) { 11039513Skarels if (sa->sa_flags & SA_NOCLDSTOP) 11139513Skarels p->p_flag |= SNOCLDSTOP; 11239513Skarels else 11339513Skarels p->p_flag &= ~SNOCLDSTOP; 11439513Skarels } 11539513Skarels /* 11639513Skarels * Set bit in p_sigignore for signals that are set to SIG_IGN, 11739513Skarels * and for signals set to SIG_DFL where the default is to ignore. 11839513Skarels * However, don't put SIGCONT in p_sigignore, 11939513Skarels * as we have to restart the process. 12039513Skarels */ 12139513Skarels if (sa->sa_handler == SIG_IGN || 12247540Skarels (sigprop[sig] & SA_IGNORE && sa->sa_handler == SIG_DFL)) { 12312951Ssam p->p_sig &= ~bit; /* never to be seen again */ 12439513Skarels if (sig != SIGCONT) 12539513Skarels p->p_sigignore |= bit; /* easier in psignal */ 12612951Ssam p->p_sigcatch &= ~bit; 12712882Ssam } else { 12812951Ssam p->p_sigignore &= ~bit; 12939513Skarels if (sa->sa_handler == SIG_DFL) 13012951Ssam p->p_sigcatch &= ~bit; 13112882Ssam else 13212951Ssam p->p_sigcatch |= bit; 13312882Ssam } 13412882Ssam (void) spl0(); 13512882Ssam } 13612882Ssam 13739513Skarels /* 13839513Skarels * Initialize signal state for process 0; 13939513Skarels * set to ignore signals that are ignored by default. 14039513Skarels */ 14147540Skarels void 14239513Skarels siginit(p) 14339513Skarels struct proc *p; 1447421Sroot { 14547540Skarels register int i; 14639513Skarels 14747540Skarels for (i = 0; i < NSIG; i++) 14847540Skarels if (sigprop[i] & SA_IGNORE && i != SIGCONT) 14947540Skarels p->p_sigignore |= sigmask(i); 15039513Skarels } 15139513Skarels 15239513Skarels /* 15339513Skarels * Reset signals for an exec of the specified process. 15439513Skarels */ 15547540Skarels void 15639513Skarels execsigs(p) 15739513Skarels register struct proc *p; 15839513Skarels { 15947540Skarels register struct sigacts *ps = p->p_sigacts; 16039513Skarels register int nc, mask; 16139513Skarels 16239513Skarels /* 16339513Skarels * Reset caught signals. Held signals remain held 16439513Skarels * through p_sigmask (unless they were caught, 16539513Skarels * and are now ignored by default). 16639513Skarels */ 16739513Skarels while (p->p_sigcatch) { 16839513Skarels nc = ffs((long)p->p_sigcatch); 16939513Skarels mask = sigmask(nc); 17039513Skarels p->p_sigcatch &= ~mask; 17147540Skarels if (sigprop[nc] & SA_IGNORE) { 17239513Skarels if (nc != SIGCONT) 17339513Skarels p->p_sigignore |= mask; 17439513Skarels p->p_sig &= ~mask; 17539513Skarels } 17647540Skarels ps->ps_sigact[nc] = SIG_DFL; 17739513Skarels } 17839513Skarels /* 17939513Skarels * Reset stack state to the user stack. 18039513Skarels * Clear set of signals caught on the signal stack. 18139513Skarels */ 18247540Skarels ps->ps_onstack = 0; 18347540Skarels ps->ps_sigsp = 0; 18447540Skarels ps->ps_sigonstack = 0; 18539513Skarels } 18639513Skarels 18739513Skarels /* 18839513Skarels * Manipulate signal mask. 18939513Skarels * Note that we receive new mask, not pointer, 19039513Skarels * and return old mask as return value; 19139513Skarels * the library stub does the rest. 19239513Skarels */ 19342920Skarels sigprocmask(p, uap, retval) 19442920Skarels register struct proc *p; 19542920Skarels struct args { 19639513Skarels int how; 19739513Skarels sigset_t mask; 19842920Skarels } *uap; 19942920Skarels int *retval; 20042920Skarels { 20139513Skarels int error = 0; 20239513Skarels 20342920Skarels *retval = p->p_sigmask; 20439513Skarels (void) splhigh(); 20539513Skarels 20639513Skarels switch (uap->how) { 20739513Skarels case SIG_BLOCK: 20839513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 20939513Skarels break; 21039513Skarels 21139513Skarels case SIG_UNBLOCK: 21239513Skarels p->p_sigmask &= ~uap->mask; 21339513Skarels break; 21439513Skarels 21539513Skarels case SIG_SETMASK: 21639513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 21739513Skarels break; 21839513Skarels 21939513Skarels default: 22039513Skarels error = EINVAL; 22139513Skarels break; 22239513Skarels } 22339513Skarels (void) spl0(); 22444405Skarels return (error); 22539513Skarels } 22639513Skarels 22742920Skarels /* ARGSUSED */ 22842920Skarels sigpending(p, uap, retval) 22942920Skarels struct proc *p; 23042920Skarels void *uap; 23142920Skarels int *retval; 23239513Skarels { 23339513Skarels 23442920Skarels *retval = p->p_sig; 23544405Skarels return (0); 23639513Skarels } 23739513Skarels 23839513Skarels #ifdef COMPAT_43 23939513Skarels /* 24039513Skarels * Generalized interface signal handler, 4.3-compatible. 24139513Skarels */ 24242920Skarels /* ARGSUSED */ 24342920Skarels osigvec(p, uap, retval) 24442920Skarels struct proc *p; 24542920Skarels register struct args { 24639513Skarels int signo; 24739513Skarels struct sigvec *nsv; 24839513Skarels struct sigvec *osv; 24942920Skarels } *uap; 25042920Skarels int *retval; 25142920Skarels { 25239513Skarels struct sigvec vec; 25347540Skarels register struct sigacts *ps = p->p_sigacts; 25439513Skarels register struct sigvec *sv; 25539513Skarels register int sig; 25639513Skarels int bit, error; 25739513Skarels 25839513Skarels sig = uap->signo; 25939513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 26044405Skarels return (EINVAL); 26139513Skarels sv = &vec; 26239513Skarels if (uap->osv) { 26347540Skarels *(sig_t *)&sv->sv_handler = ps->ps_sigact[sig]; 26447540Skarels sv->sv_mask = ps->ps_catchmask[sig]; 26539513Skarels bit = sigmask(sig); 26639513Skarels sv->sv_flags = 0; 26747540Skarels if ((ps->ps_sigonstack & bit) != 0) 26839513Skarels sv->sv_flags |= SV_ONSTACK; 26947540Skarels if ((ps->ps_sigintr & bit) != 0) 27039513Skarels sv->sv_flags |= SV_INTERRUPT; 27142920Skarels if (p->p_flag & SNOCLDSTOP) 27239513Skarels sv->sv_flags |= SA_NOCLDSTOP; 27339513Skarels if (error = copyout((caddr_t)sv, (caddr_t)uap->osv, 27439513Skarels sizeof (vec))) 27544405Skarels return (error); 27639513Skarels } 27739513Skarels if (uap->nsv) { 27839513Skarels if (error = copyin((caddr_t)uap->nsv, (caddr_t)sv, 27939513Skarels sizeof (vec))) 28044405Skarels return (error); 28139513Skarels sv->sv_flags ^= SA_RESTART; /* opposite of SV_INTERRUPT */ 28242920Skarels setsigvec(p, sig, (struct sigaction *)sv); 28339513Skarels } 28444405Skarels return (0); 28539513Skarels } 28639513Skarels 28742920Skarels osigblock(p, uap, retval) 28842920Skarels register struct proc *p; 28942920Skarels struct args { 29042920Skarels int mask; 29142920Skarels } *uap; 29242920Skarels int *retval; 29339513Skarels { 2947499Sroot 29517153Sbloom (void) splhigh(); 29642920Skarels *retval = p->p_sigmask; 29739513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 29812882Ssam (void) spl0(); 29944405Skarels return (0); 3007499Sroot } 3017499Sroot 30242920Skarels osigsetmask(p, uap, retval) 30342920Skarels struct proc *p; 30442920Skarels struct args { 30542920Skarels int mask; 30642920Skarels } *uap; 30742920Skarels int *retval; 3087499Sroot { 3097499Sroot 31017153Sbloom (void) splhigh(); 31142920Skarels *retval = p->p_sigmask; 31239513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 31312882Ssam (void) spl0(); 31444405Skarels return (0); 3157499Sroot } 31639513Skarels #endif 3177499Sroot 31839513Skarels /* 31939513Skarels * Suspend process until signal, providing mask to be set 32039513Skarels * in the meantime. Note nonstandard calling convention: 32139513Skarels * libc stub passes mask, not pointer, to save a copyin. 32239513Skarels */ 32342920Skarels /* ARGSUSED */ 32442920Skarels sigsuspend(p, uap, retval) 32542920Skarels register struct proc *p; 32642920Skarels struct args { 32742920Skarels sigset_t mask; 32842920Skarels } *uap; 32942920Skarels int *retval; 3307499Sroot { 33147540Skarels register struct sigacts *ps = p->p_sigacts; 3327499Sroot 33312882Ssam /* 33412882Ssam * When returning from sigpause, we want 33512882Ssam * the old mask to be restored after the 33612882Ssam * signal handler has finished. Thus, we 33712882Ssam * save it here and mark the proc structure 33847540Skarels * to indicate this (should be in sigacts). 33912882Ssam */ 34047540Skarels ps->ps_oldmask = p->p_sigmask; 34147540Skarels ps->ps_flags |= SA_OLDMASK; 34239513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 34347540Skarels (void) tsleep((caddr_t) ps, PPAUSE|PCATCH, "pause", 0); 34440807Smarc /* always return EINTR rather than ERESTART... */ 34544405Skarels return (EINTR); 3467499Sroot } 3477499Sroot 34842920Skarels /* ARGSUSED */ 34942920Skarels sigstack(p, uap, retval) 35042920Skarels struct proc *p; 35142920Skarels register struct args { 35212951Ssam struct sigstack *nss; 35312951Ssam struct sigstack *oss; 35442920Skarels } *uap; 35542920Skarels int *retval; 35642920Skarels { 35712951Ssam struct sigstack ss; 35839513Skarels int error = 0; 3597499Sroot 36047540Skarels if (uap->oss && (error = copyout((caddr_t)&p->p_sigacts->ps_sigstack, 36139513Skarels (caddr_t)uap->oss, sizeof (struct sigstack)))) 36244405Skarels return (error); 36339513Skarels if (uap->nss && (error = copyin((caddr_t)uap->nss, (caddr_t)&ss, 36439513Skarels sizeof (ss))) == 0) 36547540Skarels p->p_sigacts->ps_sigstack = ss; 36644405Skarels return (error); 3677499Sroot } 3687499Sroot 36942920Skarels /* ARGSUSED */ 37042920Skarels kill(cp, uap, retval) 37142920Skarels register struct proc *cp; 37242920Skarels register struct args { 37312882Ssam int pid; 37412882Ssam int signo; 37542920Skarels } *uap; 37642920Skarels int *retval; 37742920Skarels { 37818336Smckusick register struct proc *p; 37947540Skarels register struct pcred *pc = cp->p_cred; 3808032Sroot 38139513Skarels if ((unsigned) uap->signo >= NSIG) 38244405Skarels return (EINVAL); 38318336Smckusick if (uap->pid > 0) { 38418336Smckusick /* kill single process */ 38518336Smckusick p = pfind(uap->pid); 38639513Skarels if (p == 0) 38744405Skarels return (ESRCH); 38847540Skarels if (!CANSIGNAL(cp, pc, p, uap->signo)) 38944405Skarels return (EPERM); 39039513Skarels if (uap->signo) 39118336Smckusick psignal(p, uap->signo); 39244405Skarels return (0); 39318336Smckusick } 39418336Smckusick switch (uap->pid) { 39518336Smckusick case -1: /* broadcast signal */ 39644405Skarels return (killpg1(cp, uap->signo, 0, 1)); 39718336Smckusick case 0: /* signal own process group */ 39844405Skarels return (killpg1(cp, uap->signo, 0, 0)); 39918336Smckusick default: /* negative explicit process group */ 40044405Skarels return (killpg1(cp, uap->signo, -uap->pid, 0)); 40118336Smckusick } 40239513Skarels /* NOTREACHED */ 4038032Sroot } 4048032Sroot 40539513Skarels #ifdef COMPAT_43 40642920Skarels /* ARGSUSED */ 40742920Skarels okillpg(p, uap, retval) 40842920Skarels struct proc *p; 40942920Skarels register struct args { 41037581Smckusick int pgid; 4119989Ssam int signo; 41242920Skarels } *uap; 41342920Skarels int *retval; 41442920Skarels { 4158032Sroot 41639513Skarels if ((unsigned) uap->signo >= NSIG) 41744405Skarels return (EINVAL); 41844405Skarels return (killpg1(p, uap->signo, uap->pgid, 0)); 4198032Sroot } 42039513Skarels #endif 4218032Sroot 42242920Skarels /* 42342920Skarels * Common code for kill process group/broadcast kill. 42442920Skarels * cp is calling process. 42542920Skarels */ 42642920Skarels killpg1(cp, signo, pgid, all) 42742920Skarels register struct proc *cp; 42837581Smckusick int signo, pgid, all; 4299989Ssam { 4309989Ssam register struct proc *p; 43147540Skarels register struct pcred *pc = cp->p_cred; 43237581Smckusick struct pgrp *pgrp; 43347540Skarels int nfound = 0; 43437581Smckusick 43537581Smckusick if (all) 43637581Smckusick /* 43737581Smckusick * broadcast 4387421Sroot */ 43937581Smckusick for (p = allproc; p != NULL; p = p->p_nxt) { 44047540Skarels if (p->p_pid <= 1 || p->p_flag&SSYS || 44147540Skarels p == cp || !CANSIGNAL(cp, pc, p, signo)) 44237581Smckusick continue; 44347540Skarels nfound++; 44437581Smckusick if (signo) 44537581Smckusick psignal(p, signo); 44637581Smckusick } 44737581Smckusick else { 44837581Smckusick if (pgid == 0) 44937581Smckusick /* 45037581Smckusick * zero pgid means send to my process group. 45137581Smckusick */ 45247540Skarels pgrp = cp->p_pgrp; 45337581Smckusick else { 45437581Smckusick pgrp = pgfind(pgid); 45537581Smckusick if (pgrp == NULL) 45639513Skarels return (ESRCH); 45737581Smckusick } 45837581Smckusick for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) { 45947540Skarels if (p->p_pid <= 1 || p->p_flag&SSYS || 46047540Skarels !CANSIGNAL(cp, pc, p, signo)) 46137581Smckusick continue; 46247540Skarels nfound++; 46337581Smckusick if (signo) 46437581Smckusick psignal(p, signo); 46518336Smckusick } 4667421Sroot } 46747540Skarels return (nfound ? 0 : ESRCH); 4687421Sroot } 4697421Sroot 47042920Skarels /* 4717421Sroot * Send the specified signal to 47237581Smckusick * all processes with 'pgid' as 4737421Sroot * process group. 4747421Sroot */ 47547540Skarels void 47637581Smckusick gsignal(pgid, sig) 47747540Skarels int pgid, sig; 4787421Sroot { 47939513Skarels struct pgrp *pgrp; 4807421Sroot 48139513Skarels if (pgid && (pgrp = pgfind(pgid))) 48242207Smarc pgsignal(pgrp, sig, 0); 4837421Sroot } 48442920Skarels 48540807Smarc /* 48642207Smarc * Send sig to every member of a process group. 48742207Smarc * If checktty is 1, limit to members which have a controlling 48842207Smarc * terminal. 48940807Smarc */ 49047540Skarels void 49142207Smarc pgsignal(pgrp, sig, checkctty) 49239513Skarels struct pgrp *pgrp; 49347540Skarels int sig, checkctty; 49437581Smckusick { 49537581Smckusick register struct proc *p; 49637581Smckusick 49740807Smarc if (pgrp) 49840807Smarc for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) 49942207Smarc if (checkctty == 0 || p->p_flag&SCTTY) 50042207Smarc psignal(p, sig); 50137581Smckusick } 50237581Smckusick 5037421Sroot /* 50439513Skarels * Send a signal caused by a trap to the current process. 50539513Skarels * If it will be caught immediately, deliver it with correct code. 50639513Skarels * Otherwise, post it normally. 50739513Skarels */ 50847540Skarels void 50947540Skarels trapsignal(p, sig, code) 51047540Skarels struct proc *p; 51139513Skarels register int sig; 51239513Skarels unsigned code; 51339513Skarels { 51447540Skarels register struct sigacts *ps = p->p_sigacts; 51539513Skarels int mask; 51639513Skarels 51739513Skarels mask = sigmask(sig); 51839513Skarels if ((p->p_flag & STRC) == 0 && (p->p_sigcatch & mask) != 0 && 51939513Skarels (p->p_sigmask & mask) == 0) { 52047540Skarels p->p_stats->p_ru.ru_nsignals++; 52140807Smarc #ifdef KTRACE 52240807Smarc if (KTRPOINT(p, KTR_PSIG)) 52347540Skarels ktrpsig(p->p_tracep, sig, ps->ps_sigact[sig], 52440807Smarc p->p_sigmask, code); 52540807Smarc #endif 52647540Skarels sendsig(ps->ps_sigact[sig], sig, p->p_sigmask, code); 52747540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 52839513Skarels } else { 52947540Skarels ps->ps_code = code; /* XXX for core dump/debugger */ 53039513Skarels psignal(p, sig); 53139513Skarels } 53239513Skarels } 53339513Skarels 53439513Skarels /* 53540807Smarc * Send the specified signal to the specified process. 53647540Skarels * If the signal has an action, the action is usually performed 53747540Skarels * by the target process rather than the caller; we simply add 53847540Skarels * the signal to the set of pending signals for the process. 53940807Smarc * Exceptions: 54040807Smarc * o When a stop signal is sent to a sleeping process that takes the default 54140807Smarc * action, the process is stopped without awakening it. 54240807Smarc * o SIGCONT restarts stopped processes (or puts them back to sleep) 54340807Smarc * regardless of the signal action (eg, blocked or ignored). 54440807Smarc * Other ignored signals are discarded immediately. 5457421Sroot */ 54647540Skarels void 5477421Sroot psignal(p, sig) 5487421Sroot register struct proc *p; 5497421Sroot register int sig; 5507421Sroot { 55147540Skarels register int s, prop; 55239513Skarels register sig_t action; 55317153Sbloom int mask; 5547421Sroot 55539513Skarels if ((unsigned)sig >= NSIG || sig == 0) 55639513Skarels panic("psignal sig"); 55717153Sbloom mask = sigmask(sig); 55847540Skarels prop = sigprop[sig]; 5597421Sroot 5607421Sroot /* 5617421Sroot * If proc is traced, always give parent a chance. 5627421Sroot */ 5637421Sroot if (p->p_flag & STRC) 5647421Sroot action = SIG_DFL; 5657421Sroot else { 5667421Sroot /* 56712882Ssam * If the signal is being ignored, 56812882Ssam * then we forget about it immediately. 56939513Skarels * (Note: we don't set SIGCONT in p_sigignore, 57039513Skarels * and if it is set to SIG_IGN, 57139513Skarels * action will be SIG_DFL here.) 5727421Sroot */ 57317153Sbloom if (p->p_sigignore & mask) 5747421Sroot return; 57517153Sbloom if (p->p_sigmask & mask) 57612882Ssam action = SIG_HOLD; 57717153Sbloom else if (p->p_sigcatch & mask) 57812882Ssam action = SIG_CATCH; 57942437Skarels else 58012882Ssam action = SIG_DFL; 5817421Sroot } 5827421Sroot 58347540Skarels if (p->p_nice > NZERO && (sig == SIGKILL || 58447540Skarels sig == SIGTERM && (p->p_flag&STRC || action != SIG_DFL))) 58547540Skarels p->p_nice = NZERO; 5867421Sroot 58747540Skarels if (prop & SA_CONT) 58839513Skarels p->p_sig &= ~stopsigmask; 58939513Skarels 59047540Skarels if (prop & SA_STOP) { 59145672Skarels /* 59245672Skarels * If sending a tty stop signal to a member of an orphaned 59345672Skarels * process group, discard the signal here if the action 59445672Skarels * is default; don't stop the process below if sleeping, 59545672Skarels * and don't clear any pending SIGCONT. 59645672Skarels */ 59747540Skarels if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0 && 59847540Skarels action == SIG_DFL) 59945741Smckusick return; 60047540Skarels p->p_sig &= ~contsigmask; 6017421Sroot } 60239513Skarels p->p_sig |= mask; 60339513Skarels 6047421Sroot /* 60539513Skarels * Defer further processing for signals which are held, 60639513Skarels * except that stopped processes must be continued by SIGCONT. 6077421Sroot */ 60847540Skarels if (action == SIG_HOLD && ((prop & SA_CONT) == 0 || p->p_stat != SSTOP)) 6097421Sroot return; 61017153Sbloom s = splhigh(); 6117421Sroot switch (p->p_stat) { 6127421Sroot 6137421Sroot case SSLEEP: 6147421Sroot /* 61540807Smarc * If process is sleeping uninterruptibly 6167421Sroot * we can't interrupt the sleep... the signal will 6177421Sroot * be noticed when the process returns through 6187421Sroot * trap() or syscall(). 6197421Sroot */ 62040807Smarc if ((p->p_flag & SSINTR) == 0) 6217421Sroot goto out; 6227421Sroot /* 6237421Sroot * Process is sleeping and traced... make it runnable 6247421Sroot * so it can discover the signal in issig() and stop 6257421Sroot * for the parent. 6267421Sroot */ 6277421Sroot if (p->p_flag&STRC) 6287421Sroot goto run; 62939513Skarels /* 63039513Skarels * When a sleeping process receives a stop 63139513Skarels * signal, process immediately if possible. 63239513Skarels * All other (caught or default) signals 63339513Skarels * cause the process to run. 63439513Skarels */ 63547540Skarels if (prop & SA_STOP) { 6367421Sroot if (action != SIG_DFL) 63739513Skarels goto runfast; 6387421Sroot /* 63947540Skarels * If a child holding parent blocked, 64047540Skarels * stopping could cause deadlock. 6417421Sroot */ 64247540Skarels if (p->p_flag&SPPWAIT) 6437421Sroot goto out; 64417153Sbloom p->p_sig &= ~mask; 64543895Skarels p->p_xstat = sig; 64639513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 64739513Skarels psignal(p->p_pptr, SIGCHLD); 6487421Sroot stop(p); 6497421Sroot goto out; 65039513Skarels } else 65139513Skarels goto runfast; 6527421Sroot /*NOTREACHED*/ 6537421Sroot 6547421Sroot case SSTOP: 6557421Sroot /* 6567421Sroot * If traced process is already stopped, 6577421Sroot * then no further action is necessary. 6587421Sroot */ 6597421Sroot if (p->p_flag&STRC) 6607421Sroot goto out; 6617421Sroot 66247540Skarels /* 66347540Skarels * Kill signal always sets processes running. 66447540Skarels */ 66547540Skarels if (sig == SIGKILL) 66639513Skarels goto runfast; 6677421Sroot 66847540Skarels if (prop & SA_CONT) { 6697421Sroot /* 67039513Skarels * If SIGCONT is default (or ignored), we continue 67139513Skarels * the process but don't leave the signal in p_sig, 67239513Skarels * as it has no further action. If SIGCONT is held, 67339513Skarels * continue the process and leave the signal in p_sig. 6747421Sroot * If the process catches SIGCONT, let it handle 6757421Sroot * the signal itself. If it isn't waiting on 6767421Sroot * an event, then it goes back to run state. 6777421Sroot * Otherwise, process goes back to sleep state. 6787421Sroot */ 67939513Skarels if (action == SIG_DFL) 68039513Skarels p->p_sig &= ~mask; 68139513Skarels if (action == SIG_CATCH) 68239513Skarels goto runfast; 68339513Skarels if (p->p_wchan == 0) 6847421Sroot goto run; 6857421Sroot p->p_stat = SSLEEP; 6867421Sroot goto out; 68747540Skarels } 6887421Sroot 68947540Skarels if (prop & SA_STOP) { 6907421Sroot /* 6917421Sroot * Already stopped, don't need to stop again. 6927421Sroot * (If we did the shell could get confused.) 6937421Sroot */ 69417153Sbloom p->p_sig &= ~mask; /* take it away */ 6957421Sroot goto out; 6967421Sroot } 6977421Sroot 69847540Skarels /* 69947540Skarels * If process is sleeping interruptibly, then 70047540Skarels * simulate a wakeup so that when it is continued, 70147540Skarels * it will be made runnable and can look at the signal. 70247540Skarels * But don't setrun the process, leave it stopped. 70347540Skarels */ 70447540Skarels if (p->p_wchan && p->p_flag & SSINTR) 70547540Skarels unsleep(p); 70647540Skarels goto out; 70747540Skarels 7087421Sroot default: 7097421Sroot /* 7107421Sroot * SRUN, SIDL, SZOMB do nothing with the signal, 7117421Sroot * other than kicking ourselves if we are running. 7127421Sroot * It will either never be noticed, or noticed very soon. 7137421Sroot */ 714*47650Skarels if (p == curproc) 7157421Sroot aston(); 7167421Sroot goto out; 7177421Sroot } 7187421Sroot /*NOTREACHED*/ 71939513Skarels 72039513Skarels runfast: 7217421Sroot /* 7227421Sroot * Raise priority to at least PUSER. 7237421Sroot */ 7247421Sroot if (p->p_pri > PUSER) 72517399Skarels p->p_pri = PUSER; 72639513Skarels run: 7277421Sroot setrun(p); 7287421Sroot out: 7297421Sroot splx(s); 7307421Sroot } 7317421Sroot 7327421Sroot /* 73340807Smarc * If the current process has a signal to process (should be caught 73440807Smarc * or cause termination, should interrupt current syscall), 73540807Smarc * return the signal number. Stop signals with default action 73640807Smarc * are processed immediately, then cleared; they aren't returned. 73747540Skarels * This is checked after each entry to the system for a syscall 73847540Skarels * or trap (though this can usually be done without actually calling 73947540Skarels * issig by checking the pending signal masks in the CURSIG macro.) 74047540Skarels * The normal call sequence is 74147540Skarels * 74247540Skarels * while (sig = CURSIG(curproc)) 74347540Skarels * psig(sig); 7447421Sroot */ 74547540Skarels issig(p) 74647540Skarels register struct proc *p; 7477421Sroot { 74847540Skarels register int sig, mask, prop; 7497421Sroot 7507421Sroot for (;;) { 75139513Skarels mask = p->p_sig &~ p->p_sigmask; 75247540Skarels if (p->p_flag&SPPWAIT) 75339513Skarels mask &= ~stopsigmask; 75440807Smarc if (mask == 0) /* no signal to send */ 75540807Smarc return (0); 75639513Skarels sig = ffs((long)mask); 75717153Sbloom mask = sigmask(sig); 75847540Skarels prop = sigprop[sig]; 75940807Smarc /* 76040807Smarc * We should see pending but ignored signals 76140807Smarc * only if STRC was on when they were posted. 76240807Smarc */ 76340807Smarc if (mask & p->p_sigignore && (p->p_flag&STRC) == 0) { 76440807Smarc p->p_sig &= ~mask; 76540807Smarc continue; 76640807Smarc } 76747540Skarels if (p->p_flag&STRC && (p->p_flag&SPPWAIT) == 0) { 7687421Sroot /* 7697421Sroot * If traced, always stop, and stay 7707421Sroot * stopped until released by the parent. 7717421Sroot */ 77243895Skarels p->p_xstat = sig; 77318331Skarels psignal(p->p_pptr, SIGCHLD); 7747421Sroot do { 7757421Sroot stop(p); 7767421Sroot swtch(); 77742926Smckusick } while (!procxmt(p) && p->p_flag&STRC); 7787421Sroot 7797421Sroot /* 78014782Ssam * If the traced bit got turned off, 78140807Smarc * go back up to the top to rescan signals. 782*47650Skarels * This ensures that p_sig* and ps_sigact 783*47650Skarels * are consistent. 7847421Sroot */ 78540807Smarc if ((p->p_flag&STRC) == 0) 7867421Sroot continue; 7877421Sroot 7887421Sroot /* 7897421Sroot * If parent wants us to take the signal, 79043895Skarels * then it will leave it in p->p_xstat; 7917421Sroot * otherwise we just look for signals again. 7927421Sroot */ 79340807Smarc p->p_sig &= ~mask; /* clear the old signal */ 79443895Skarels sig = p->p_xstat; 7957421Sroot if (sig == 0) 7967421Sroot continue; 79714782Ssam 79814782Ssam /* 79940807Smarc * Put the new signal into p_sig. 80040807Smarc * If signal is being masked, 80140807Smarc * look for other signals. 80214782Ssam */ 80317153Sbloom mask = sigmask(sig); 80440807Smarc p->p_sig |= mask; 80540807Smarc if (p->p_sigmask & mask) 80614782Ssam continue; 8077421Sroot } 80840807Smarc 80940807Smarc /* 81040807Smarc * Decide whether the signal should be returned. 81140807Smarc * Return the signal's number, or fall through 81240807Smarc * to clear it from the pending mask. 81340807Smarc */ 81447540Skarels switch ((int)p->p_sigacts->ps_sigact[sig]) { 8157421Sroot 8167421Sroot case SIG_DFL: 8177421Sroot /* 8187421Sroot * Don't take default actions on system processes. 8197421Sroot */ 82047540Skarels if (p->p_pid <= 1) 82140807Smarc break; /* == ignore */ 82240807Smarc /* 82340807Smarc * If there is a pending stop signal to process 82440807Smarc * with default action, stop here, 82542437Skarels * then clear the signal. However, 82642437Skarels * if process is member of an orphaned 82742437Skarels * process group, ignore tty stop signals. 82840807Smarc */ 82947540Skarels if (prop & SA_STOP) { 83042437Skarels if (p->p_flag&STRC || 83142437Skarels (p->p_pgrp->pg_jobc == 0 && 83247540Skarels prop & SA_TTYSTOP)) 83340807Smarc break; /* == ignore */ 83443895Skarels p->p_xstat = sig; 8357421Sroot stop(p); 83639513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 83739513Skarels psignal(p->p_pptr, SIGCHLD); 8387421Sroot swtch(); 83940807Smarc break; 84047540Skarels } else if (prop & SA_IGNORE) { 8417421Sroot /* 84239513Skarels * Except for SIGCONT, shouldn't get here. 84339513Skarels * Default action is to ignore; drop it. 8447421Sroot */ 84540807Smarc break; /* == ignore */ 84639513Skarels } else 84740807Smarc return (sig); 8487421Sroot /*NOTREACHED*/ 8497421Sroot 8507421Sroot case SIG_IGN: 8517421Sroot /* 85239513Skarels * Masking above should prevent us ever trying 85339513Skarels * to take action on an ignored signal other 85439513Skarels * than SIGCONT, unless process is traced. 8557421Sroot */ 85647540Skarels if ((prop & SA_CONT) == 0 && (p->p_flag&STRC) == 0) 8577421Sroot printf("issig\n"); 85840807Smarc break; /* == ignore */ 8597421Sroot 8607421Sroot default: 8617421Sroot /* 8627421Sroot * This signal has an action, let 8637421Sroot * psig process it. 8647421Sroot */ 86540807Smarc return (sig); 8667421Sroot } 86740807Smarc p->p_sig &= ~mask; /* take the signal! */ 8687421Sroot } 86940807Smarc /* NOTREACHED */ 8707421Sroot } 8717421Sroot 8727421Sroot /* 8737421Sroot * Put the argument process into the stopped 87418331Skarels * state and notify the parent via wakeup. 87518331Skarels * Signals are handled elsewhere. 87640807Smarc * The process must not be on the run queue. 8777421Sroot */ 8787421Sroot stop(p) 8797421Sroot register struct proc *p; 8807421Sroot { 8817421Sroot 8827421Sroot p->p_stat = SSTOP; 8837421Sroot p->p_flag &= ~SWTED; 8847421Sroot wakeup((caddr_t)p->p_pptr); 8857421Sroot } 8867421Sroot 8877421Sroot /* 88847540Skarels * Take the action for the specified signal 88947540Skarels * from the current set of pending signals. 8907421Sroot */ 89147540Skarels void 89240807Smarc psig(sig) 89340807Smarc register int sig; 8947421Sroot { 89547540Skarels register struct proc *p = curproc; 89647540Skarels register struct sigacts *ps = p->p_sigacts; 89747540Skarels register sig_t action; 89839513Skarels int mask, returnmask; 8997421Sroot 90040807Smarc #ifdef DIAGNOSTIC 90147540Skarels if (sig == 0) 90247540Skarels panic("psig"); 90340807Smarc #endif 90447540Skarels mask = sigmask(sig); 90547540Skarels p->p_sig &= ~mask; 90647540Skarels action = ps->ps_sigact[sig]; 90740807Smarc #ifdef KTRACE 90847540Skarels if (KTRPOINT(p, KTR_PSIG)) 90947540Skarels ktrpsig(p->p_tracep, sig, action, ps->ps_flags & SA_OLDMASK ? 91047540Skarels ps->ps_oldmask : p->p_sigmask, 0); 91140807Smarc #endif 91247540Skarels if (action == SIG_DFL) { 91347540Skarels /* 91447540Skarels * Default action, where the default is to kill 91547540Skarels * the process. (Other cases were ignored above.) 91647540Skarels */ 917*47650Skarels sigexit(p, sig); 91847540Skarels /* NOTREACHED */ 91947540Skarels } else { 92047540Skarels /* 92147540Skarels * If we get here, the signal must be caught. 92247540Skarels */ 92339513Skarels #ifdef DIAGNOSTIC 92447540Skarels if (action == SIG_IGN || (p->p_sigmask & mask)) 92547540Skarels panic("psig action"); 92639513Skarels #endif 92747540Skarels /* 92847540Skarels * Set the new mask value and also defer further 92947540Skarels * occurences of this signal. 93047540Skarels * 93147540Skarels * Special case: user has done a sigpause. Here the 93247540Skarels * current mask is not of interest, but rather the 93347540Skarels * mask from before the sigpause is what we want 93447540Skarels * restored after the signal processing is completed. 93547540Skarels */ 93647540Skarels (void) splhigh(); 93747540Skarels if (ps->ps_flags & SA_OLDMASK) { 93847540Skarels returnmask = ps->ps_oldmask; 93947540Skarels ps->ps_flags &= ~SA_OLDMASK; 94047540Skarels } else 94147540Skarels returnmask = p->p_sigmask; 94247540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 94347540Skarels (void) spl0(); 94447540Skarels p->p_stats->p_ru.ru_nsignals++; 94547540Skarels sendsig(action, sig, returnmask, 0); 94647540Skarels } 9477421Sroot } 9487421Sroot 9497421Sroot /* 950*47650Skarels * Force the current process to exit with the specified 951*47650Skarels * signal, dumping core if appropriate. We bypass the normal 952*47650Skarels * tests for masked and caught signals, allowing unrecoverable 953*47650Skarels * failures to terminate the process without changing signal state. 954*47650Skarels * Mark the accounting record with the signal termination. 955*47650Skarels * If dumping core, save the signal number for the debugger. 956*47650Skarels * Calls exit and does not return. 957*47650Skarels */ 958*47650Skarels sigexit(p, sig) 959*47650Skarels register struct proc *p; 960*47650Skarels int sig; 961*47650Skarels { 962*47650Skarels 963*47650Skarels p->p_acflag |= AXSIG; 964*47650Skarels if (sigprop[sig] & SA_CORE) { 965*47650Skarels p->p_sigacts->ps_sig = sig; 966*47650Skarels if (coredump(p) == 0) 967*47650Skarels sig |= WCOREFLAG; 968*47650Skarels } 969*47650Skarels exit(p, W_EXITCODE(0, sig)); 970*47650Skarels /* NOTREACHED */ 971*47650Skarels } 972*47650Skarels 973*47650Skarels /* 97447540Skarels * Create a core dump. 97547540Skarels * The file name should probably be "core.progname" 97647540Skarels * (or "mos.progname", or "dram.progname", or ...). 97747540Skarels * Core dumps aren't created if the process 9787421Sroot */ 97947540Skarels coredump(p) 98047540Skarels register struct proc *p; 9817421Sroot { 98237728Smckusick register struct vnode *vp; 98347540Skarels register struct pcred *pcred = p->p_cred; 98447540Skarels register struct ucred *cred = pcred->pc_ucred; 98547540Skarels register struct vmspace *vm = p->p_vmspace; 98637580Smckusick struct vattr vattr; 98737580Smckusick int error; 98847540Skarels struct nameidata nd; 9897421Sroot 99047540Skarels if (pcred->p_svuid != pcred->p_ruid || 99147540Skarels pcred->p_svgid != pcred->p_rgid) 99237580Smckusick return (EFAULT); 99347540Skarels if (ctob(UPAGES + vm->vm_dsize + vm->vm_ssize) >= 99447540Skarels p->p_rlimit[RLIMIT_CORE].rlim_cur) 99537580Smckusick return (EFAULT); 99647540Skarels nd.ni_segflg = UIO_SYSSPACE; 99747540Skarels nd.ni_dirp = "core"; 99847540Skarels if (error = vn_open(&nd, p, FCREAT|FWRITE, 0644)) 99937580Smckusick return (error); 100047540Skarels vp = nd.ni_vp; 100138394Smckusick VOP_LOCK(vp); 100247540Skarels if (vp->v_type != VREG || VOP_GETATTR(vp, &vattr, cred) || 100337580Smckusick vattr.va_nlink != 1) { 100438394Smckusick vput(vp); 100538394Smckusick return (EFAULT); 10067818Sroot } 100741362Smckusick VATTR_NULL(&vattr); 100837580Smckusick vattr.va_size = 0; 100947540Skarels VOP_SETATTR(vp, &vattr, cred); 101047540Skarels p->p_acflag |= ACORE; 1011*47650Skarels bcopy(p, &u.u_kproc.kp_proc, sizeof(struct proc)); 1012*47650Skarels fill_eproc(p, &u.u_kproc.kp_eproc); 101342004Smckusick #ifdef HPUXCOMPAT 101442004Smckusick /* 101542004Smckusick * BLETCH! If we loaded from an HPUX format binary file 101642004Smckusick * we have to dump an HPUX style user struct so that the 101742004Smckusick * HPUX debuggers can grok it. 101842004Smckusick */ 101942004Smckusick if (u.u_pcb.pcb_flags & PCB_HPUXBIN) 102047540Skarels error = hpuxdumpu(vp, cred); 102142004Smckusick else 102242004Smckusick #endif 102337580Smckusick error = vn_rdwr(UIO_WRITE, vp, (caddr_t)&u, ctob(UPAGES), (off_t)0, 102447540Skarels UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, cred, (int *)0); 102537580Smckusick if (error == 0) 102647540Skarels error = vn_rdwr(UIO_WRITE, vp, vm->vm_daddr, 102747540Skarels (int)ctob(vm->vm_dsize), (off_t)ctob(UPAGES), UIO_USERSPACE, 102847540Skarels IO_NODELOCKED|IO_UNIT, cred, (int *)0); 102937580Smckusick if (error == 0) 103037580Smckusick error = vn_rdwr(UIO_WRITE, vp, 103147540Skarels trunc_page(USRSTACK - ctob(vm->vm_ssize)), 103247540Skarels round_page(ctob(vm->vm_ssize)), 103347540Skarels (off_t)ctob(UPAGES) + ctob(vm->vm_dsize), UIO_USERSPACE, 103447540Skarels IO_NODELOCKED|IO_UNIT, cred, (int *)0); 103538394Smckusick vput(vp); 103637580Smckusick return (error); 10377421Sroot } 103839513Skarels 103939513Skarels /* 104039513Skarels * Nonexistent system call-- signal process (may want to handle it). 104139513Skarels * Flag error in case process won't see signal immediately (blocked or ignored). 104239513Skarels */ 104343364Smckusick /* ARGSUSED */ 104443364Smckusick nosys(p, args, retval) 104543364Smckusick struct proc *p; 104643364Smckusick void *args; 104743364Smckusick int *retval; 104839513Skarels { 104939513Skarels 105043364Smckusick psignal(p, SIGSYS); 105144405Skarels return (EINVAL); 105239513Skarels } 1053