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*50099Smckusick * @(#)kern_sig.c 7.32 (Berkeley) 06/19/91 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 "seg.h" 2217092Sbloom #include "acct.h" 2337580Smckusick #include "file.h" 2417092Sbloom #include "kernel.h" 2539513Skarels #include "wait.h" 2640807Smarc #include "ktrace.h" 277421Sroot 2849102Skarels #include "machine/cpu.h" 2949102Skarels 3047650Skarels #include "vm/vm.h" 3147650Skarels #include "kinfo_proc.h" 3247650Skarels #include "user.h" /* for coredump */ 3337581Smckusick 3417013Smckusick /* 3547540Skarels * Can process p, with pcred pc, send the signal signo to process q? 3617013Smckusick */ 3747540Skarels #define CANSIGNAL(p, pc, q, signo) \ 3847540Skarels ((pc)->pc_ucred->cr_uid == 0 || \ 3947540Skarels (pc)->p_ruid == (q)->p_cred->p_ruid || \ 4047540Skarels (pc)->pc_ucred->cr_uid == (q)->p_cred->p_ruid || \ 4147540Skarels (pc)->p_ruid == (q)->p_ucred->cr_uid || \ 4247540Skarels (pc)->pc_ucred->cr_uid == (q)->p_ucred->cr_uid || \ 4342920Skarels ((signo) == SIGCONT && (q)->p_session == (p)->p_session)) 4439513Skarels 4542920Skarels /* ARGSUSED */ 4642920Skarels sigaction(p, uap, retval) 4742920Skarels struct proc *p; 4842920Skarels register struct args { 4912882Ssam int signo; 5039513Skarels struct sigaction *nsa; 5139513Skarels struct sigaction *osa; 5242920Skarels } *uap; 5342920Skarels int *retval; 5442920Skarels { 5539513Skarels struct sigaction vec; 5639513Skarels register struct sigaction *sa; 5747540Skarels register struct sigacts *ps = p->p_sigacts; 5812882Ssam register int sig; 5939513Skarels int bit, error; 607421Sroot 6112882Ssam sig = uap->signo; 6239513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 6344405Skarels return (EINVAL); 6439513Skarels sa = &vec; 6539513Skarels if (uap->osa) { 6647540Skarels sa->sa_handler = ps->ps_sigact[sig]; 6747540Skarels sa->sa_mask = ps->ps_catchmask[sig]; 6818308Smckusick bit = sigmask(sig); 6939513Skarels sa->sa_flags = 0; 7047540Skarels if ((ps->ps_sigonstack & bit) != 0) 7139513Skarels sa->sa_flags |= SA_ONSTACK; 7247540Skarels if ((ps->ps_sigintr & bit) == 0) 7339513Skarels sa->sa_flags |= SA_RESTART; 7442920Skarels if (p->p_flag & SNOCLDSTOP) 7539513Skarels sa->sa_flags |= SA_NOCLDSTOP; 7639513Skarels if (error = copyout((caddr_t)sa, (caddr_t)uap->osa, 7739513Skarels sizeof (vec))) 7844405Skarels return (error); 7912951Ssam } 8039513Skarels if (uap->nsa) { 8139513Skarels if (error = copyin((caddr_t)uap->nsa, (caddr_t)sa, 8239513Skarels sizeof (vec))) 8344405Skarels return (error); 8442920Skarels setsigvec(p, sig, sa); 8512951Ssam } 8644405Skarels return (0); 877421Sroot } 887421Sroot 8942920Skarels setsigvec(p, sig, sa) 9042920Skarels register struct proc *p; 9112951Ssam int sig; 9239513Skarels register struct sigaction *sa; 9312882Ssam { 9447540Skarels register struct sigacts *ps = p->p_sigacts; 9512951Ssam register int bit; 9612882Ssam 9717153Sbloom bit = sigmask(sig); 9812882Ssam /* 9912882Ssam * Change setting atomically. 10012882Ssam */ 10117153Sbloom (void) splhigh(); 10247540Skarels ps->ps_sigact[sig] = sa->sa_handler; 10347540Skarels ps->ps_catchmask[sig] = sa->sa_mask &~ sigcantmask; 10439513Skarels if ((sa->sa_flags & SA_RESTART) == 0) 10547540Skarels ps->ps_sigintr |= bit; 10618308Smckusick else 10747540Skarels ps->ps_sigintr &= ~bit; 10839513Skarels if (sa->sa_flags & SA_ONSTACK) 10947540Skarels ps->ps_sigonstack |= bit; 11012951Ssam else 11147540Skarels ps->ps_sigonstack &= ~bit; 11239513Skarels if (sig == SIGCHLD) { 11339513Skarels if (sa->sa_flags & SA_NOCLDSTOP) 11439513Skarels p->p_flag |= SNOCLDSTOP; 11539513Skarels else 11639513Skarels p->p_flag &= ~SNOCLDSTOP; 11739513Skarels } 11839513Skarels /* 11939513Skarels * Set bit in p_sigignore for signals that are set to SIG_IGN, 12039513Skarels * and for signals set to SIG_DFL where the default is to ignore. 12139513Skarels * However, don't put SIGCONT in p_sigignore, 12239513Skarels * as we have to restart the process. 12339513Skarels */ 12439513Skarels if (sa->sa_handler == SIG_IGN || 12547540Skarels (sigprop[sig] & SA_IGNORE && sa->sa_handler == SIG_DFL)) { 12612951Ssam p->p_sig &= ~bit; /* never to be seen again */ 12739513Skarels if (sig != SIGCONT) 12839513Skarels p->p_sigignore |= bit; /* easier in psignal */ 12912951Ssam p->p_sigcatch &= ~bit; 13012882Ssam } else { 13112951Ssam p->p_sigignore &= ~bit; 13239513Skarels if (sa->sa_handler == SIG_DFL) 13312951Ssam p->p_sigcatch &= ~bit; 13412882Ssam else 13512951Ssam p->p_sigcatch |= bit; 13612882Ssam } 13712882Ssam (void) spl0(); 13812882Ssam } 13912882Ssam 14039513Skarels /* 14139513Skarels * Initialize signal state for process 0; 14239513Skarels * set to ignore signals that are ignored by default. 14339513Skarels */ 14447540Skarels void 14539513Skarels siginit(p) 14639513Skarels struct proc *p; 1477421Sroot { 14847540Skarels register int i; 14939513Skarels 15047540Skarels for (i = 0; i < NSIG; i++) 15147540Skarels if (sigprop[i] & SA_IGNORE && i != SIGCONT) 15247540Skarels p->p_sigignore |= sigmask(i); 15339513Skarels } 15439513Skarels 15539513Skarels /* 15639513Skarels * Reset signals for an exec of the specified process. 15739513Skarels */ 15847540Skarels void 15939513Skarels execsigs(p) 16039513Skarels register struct proc *p; 16139513Skarels { 16247540Skarels register struct sigacts *ps = p->p_sigacts; 16339513Skarels register int nc, mask; 16439513Skarels 16539513Skarels /* 16639513Skarels * Reset caught signals. Held signals remain held 16739513Skarels * through p_sigmask (unless they were caught, 16839513Skarels * and are now ignored by default). 16939513Skarels */ 17039513Skarels while (p->p_sigcatch) { 17139513Skarels nc = ffs((long)p->p_sigcatch); 17239513Skarels mask = sigmask(nc); 17339513Skarels p->p_sigcatch &= ~mask; 17447540Skarels if (sigprop[nc] & SA_IGNORE) { 17539513Skarels if (nc != SIGCONT) 17639513Skarels p->p_sigignore |= mask; 17739513Skarels p->p_sig &= ~mask; 17839513Skarels } 17947540Skarels ps->ps_sigact[nc] = SIG_DFL; 18039513Skarels } 18139513Skarels /* 18239513Skarels * Reset stack state to the user stack. 18339513Skarels * Clear set of signals caught on the signal stack. 18439513Skarels */ 18547540Skarels ps->ps_onstack = 0; 18647540Skarels ps->ps_sigsp = 0; 18747540Skarels ps->ps_sigonstack = 0; 18839513Skarels } 18939513Skarels 19039513Skarels /* 19139513Skarels * Manipulate signal mask. 19239513Skarels * Note that we receive new mask, not pointer, 19339513Skarels * and return old mask as return value; 19439513Skarels * the library stub does the rest. 19539513Skarels */ 19642920Skarels sigprocmask(p, uap, retval) 19742920Skarels register struct proc *p; 19842920Skarels struct args { 19939513Skarels int how; 20039513Skarels sigset_t mask; 20142920Skarels } *uap; 20242920Skarels int *retval; 20342920Skarels { 20439513Skarels int error = 0; 20539513Skarels 20642920Skarels *retval = p->p_sigmask; 20739513Skarels (void) splhigh(); 20839513Skarels 20939513Skarels switch (uap->how) { 21039513Skarels case SIG_BLOCK: 21139513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 21239513Skarels break; 21339513Skarels 21439513Skarels case SIG_UNBLOCK: 21539513Skarels p->p_sigmask &= ~uap->mask; 21639513Skarels break; 21739513Skarels 21839513Skarels case SIG_SETMASK: 21939513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 22039513Skarels break; 22139513Skarels 22239513Skarels default: 22339513Skarels error = EINVAL; 22439513Skarels break; 22539513Skarels } 22639513Skarels (void) spl0(); 22744405Skarels return (error); 22839513Skarels } 22939513Skarels 23042920Skarels /* ARGSUSED */ 23142920Skarels sigpending(p, uap, retval) 23242920Skarels struct proc *p; 23342920Skarels void *uap; 23442920Skarels int *retval; 23539513Skarels { 23639513Skarels 23742920Skarels *retval = p->p_sig; 23844405Skarels return (0); 23939513Skarels } 24039513Skarels 24139513Skarels #ifdef COMPAT_43 24239513Skarels /* 24339513Skarels * Generalized interface signal handler, 4.3-compatible. 24439513Skarels */ 24542920Skarels /* ARGSUSED */ 24642920Skarels osigvec(p, uap, retval) 24742920Skarels struct proc *p; 24842920Skarels register struct args { 24939513Skarels int signo; 25039513Skarels struct sigvec *nsv; 25139513Skarels struct sigvec *osv; 25242920Skarels } *uap; 25342920Skarels int *retval; 25442920Skarels { 25539513Skarels struct sigvec vec; 25647540Skarels register struct sigacts *ps = p->p_sigacts; 25739513Skarels register struct sigvec *sv; 25839513Skarels register int sig; 25939513Skarels int bit, error; 26039513Skarels 26139513Skarels sig = uap->signo; 26239513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 26344405Skarels return (EINVAL); 26439513Skarels sv = &vec; 26539513Skarels if (uap->osv) { 26647540Skarels *(sig_t *)&sv->sv_handler = ps->ps_sigact[sig]; 26747540Skarels sv->sv_mask = ps->ps_catchmask[sig]; 26839513Skarels bit = sigmask(sig); 26939513Skarels sv->sv_flags = 0; 27047540Skarels if ((ps->ps_sigonstack & bit) != 0) 27139513Skarels sv->sv_flags |= SV_ONSTACK; 27247540Skarels if ((ps->ps_sigintr & bit) != 0) 27339513Skarels sv->sv_flags |= SV_INTERRUPT; 27442920Skarels if (p->p_flag & SNOCLDSTOP) 27539513Skarels sv->sv_flags |= SA_NOCLDSTOP; 27639513Skarels if (error = copyout((caddr_t)sv, (caddr_t)uap->osv, 27739513Skarels sizeof (vec))) 27844405Skarels return (error); 27939513Skarels } 28039513Skarels if (uap->nsv) { 28139513Skarels if (error = copyin((caddr_t)uap->nsv, (caddr_t)sv, 28239513Skarels sizeof (vec))) 28344405Skarels return (error); 28439513Skarels sv->sv_flags ^= SA_RESTART; /* opposite of SV_INTERRUPT */ 28542920Skarels setsigvec(p, sig, (struct sigaction *)sv); 28639513Skarels } 28744405Skarels return (0); 28839513Skarels } 28939513Skarels 29042920Skarels osigblock(p, uap, retval) 29142920Skarels register struct proc *p; 29242920Skarels struct args { 29342920Skarels int mask; 29442920Skarels } *uap; 29542920Skarels int *retval; 29639513Skarels { 2977499Sroot 29817153Sbloom (void) splhigh(); 29942920Skarels *retval = p->p_sigmask; 30039513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 30112882Ssam (void) spl0(); 30244405Skarels return (0); 3037499Sroot } 3047499Sroot 30542920Skarels osigsetmask(p, uap, retval) 30642920Skarels struct proc *p; 30742920Skarels struct args { 30842920Skarels int mask; 30942920Skarels } *uap; 31042920Skarels int *retval; 3117499Sroot { 3127499Sroot 31317153Sbloom (void) splhigh(); 31442920Skarels *retval = p->p_sigmask; 31539513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 31612882Ssam (void) spl0(); 31744405Skarels return (0); 3187499Sroot } 31939513Skarels #endif 3207499Sroot 32139513Skarels /* 32239513Skarels * Suspend process until signal, providing mask to be set 32339513Skarels * in the meantime. Note nonstandard calling convention: 32439513Skarels * libc stub passes mask, not pointer, to save a copyin. 32539513Skarels */ 32642920Skarels /* ARGSUSED */ 32742920Skarels sigsuspend(p, uap, retval) 32842920Skarels register struct proc *p; 32942920Skarels struct args { 33042920Skarels sigset_t mask; 33142920Skarels } *uap; 33242920Skarels int *retval; 3337499Sroot { 33447540Skarels register struct sigacts *ps = p->p_sigacts; 3357499Sroot 33612882Ssam /* 33712882Ssam * When returning from sigpause, we want 33812882Ssam * the old mask to be restored after the 33912882Ssam * signal handler has finished. Thus, we 34012882Ssam * save it here and mark the proc structure 34147540Skarels * to indicate this (should be in sigacts). 34212882Ssam */ 34347540Skarels ps->ps_oldmask = p->p_sigmask; 34447540Skarels ps->ps_flags |= SA_OLDMASK; 34539513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 34647540Skarels (void) tsleep((caddr_t) ps, PPAUSE|PCATCH, "pause", 0); 34740807Smarc /* always return EINTR rather than ERESTART... */ 34844405Skarels return (EINTR); 3497499Sroot } 3507499Sroot 35142920Skarels /* ARGSUSED */ 35242920Skarels sigstack(p, uap, retval) 35342920Skarels struct proc *p; 35442920Skarels register struct args { 35512951Ssam struct sigstack *nss; 35612951Ssam struct sigstack *oss; 35742920Skarels } *uap; 35842920Skarels int *retval; 35942920Skarels { 36012951Ssam struct sigstack ss; 36139513Skarels int error = 0; 3627499Sroot 36347540Skarels if (uap->oss && (error = copyout((caddr_t)&p->p_sigacts->ps_sigstack, 36439513Skarels (caddr_t)uap->oss, sizeof (struct sigstack)))) 36544405Skarels return (error); 36639513Skarels if (uap->nss && (error = copyin((caddr_t)uap->nss, (caddr_t)&ss, 36739513Skarels sizeof (ss))) == 0) 36847540Skarels p->p_sigacts->ps_sigstack = ss; 36944405Skarels return (error); 3707499Sroot } 3717499Sroot 37242920Skarels /* ARGSUSED */ 37342920Skarels kill(cp, uap, retval) 37442920Skarels register struct proc *cp; 37542920Skarels register struct args { 37612882Ssam int pid; 37712882Ssam int signo; 37842920Skarels } *uap; 37942920Skarels int *retval; 38042920Skarels { 38118336Smckusick register struct proc *p; 38247540Skarels register struct pcred *pc = cp->p_cred; 3838032Sroot 38439513Skarels if ((unsigned) uap->signo >= NSIG) 38544405Skarels return (EINVAL); 38618336Smckusick if (uap->pid > 0) { 38718336Smckusick /* kill single process */ 38818336Smckusick p = pfind(uap->pid); 38939513Skarels if (p == 0) 39044405Skarels return (ESRCH); 39147540Skarels if (!CANSIGNAL(cp, pc, p, uap->signo)) 39244405Skarels return (EPERM); 39339513Skarels if (uap->signo) 39418336Smckusick psignal(p, uap->signo); 39544405Skarels return (0); 39618336Smckusick } 39718336Smckusick switch (uap->pid) { 39818336Smckusick case -1: /* broadcast signal */ 39944405Skarels return (killpg1(cp, uap->signo, 0, 1)); 40018336Smckusick case 0: /* signal own process group */ 40144405Skarels return (killpg1(cp, uap->signo, 0, 0)); 40218336Smckusick default: /* negative explicit process group */ 40344405Skarels return (killpg1(cp, uap->signo, -uap->pid, 0)); 40418336Smckusick } 40539513Skarels /* NOTREACHED */ 4068032Sroot } 4078032Sroot 40839513Skarels #ifdef COMPAT_43 40942920Skarels /* ARGSUSED */ 41042920Skarels okillpg(p, uap, retval) 41142920Skarels struct proc *p; 41242920Skarels register struct args { 41337581Smckusick int pgid; 4149989Ssam int signo; 41542920Skarels } *uap; 41642920Skarels int *retval; 41742920Skarels { 4188032Sroot 41939513Skarels if ((unsigned) uap->signo >= NSIG) 42044405Skarels return (EINVAL); 42144405Skarels return (killpg1(p, uap->signo, uap->pgid, 0)); 4228032Sroot } 42339513Skarels #endif 4248032Sroot 42542920Skarels /* 42642920Skarels * Common code for kill process group/broadcast kill. 42742920Skarels * cp is calling process. 42842920Skarels */ 42942920Skarels killpg1(cp, signo, pgid, all) 43042920Skarels register struct proc *cp; 43137581Smckusick int signo, pgid, all; 4329989Ssam { 4339989Ssam register struct proc *p; 43447540Skarels register struct pcred *pc = cp->p_cred; 43537581Smckusick struct pgrp *pgrp; 43647540Skarels int nfound = 0; 43737581Smckusick 43837581Smckusick if (all) 43937581Smckusick /* 44037581Smckusick * broadcast 4417421Sroot */ 44237581Smckusick for (p = allproc; p != NULL; p = p->p_nxt) { 44347540Skarels if (p->p_pid <= 1 || p->p_flag&SSYS || 44447540Skarels p == cp || !CANSIGNAL(cp, pc, p, signo)) 44537581Smckusick continue; 44647540Skarels nfound++; 44737581Smckusick if (signo) 44837581Smckusick psignal(p, signo); 44937581Smckusick } 45037581Smckusick else { 45137581Smckusick if (pgid == 0) 45237581Smckusick /* 45337581Smckusick * zero pgid means send to my process group. 45437581Smckusick */ 45547540Skarels pgrp = cp->p_pgrp; 45637581Smckusick else { 45737581Smckusick pgrp = pgfind(pgid); 45837581Smckusick if (pgrp == NULL) 45939513Skarels return (ESRCH); 46037581Smckusick } 46137581Smckusick for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) { 46247540Skarels if (p->p_pid <= 1 || p->p_flag&SSYS || 46347540Skarels !CANSIGNAL(cp, pc, p, signo)) 46437581Smckusick continue; 46547540Skarels nfound++; 46637581Smckusick if (signo) 46737581Smckusick psignal(p, signo); 46818336Smckusick } 4697421Sroot } 47047540Skarels return (nfound ? 0 : ESRCH); 4717421Sroot } 4727421Sroot 47342920Skarels /* 4747421Sroot * Send the specified signal to 47537581Smckusick * all processes with 'pgid' as 4767421Sroot * process group. 4777421Sroot */ 47847540Skarels void 47937581Smckusick gsignal(pgid, sig) 48047540Skarels int pgid, sig; 4817421Sroot { 48239513Skarels struct pgrp *pgrp; 4837421Sroot 48439513Skarels if (pgid && (pgrp = pgfind(pgid))) 48542207Smarc pgsignal(pgrp, sig, 0); 4867421Sroot } 48742920Skarels 48840807Smarc /* 48942207Smarc * Send sig to every member of a process group. 49042207Smarc * If checktty is 1, limit to members which have a controlling 49142207Smarc * terminal. 49240807Smarc */ 49347540Skarels void 49442207Smarc pgsignal(pgrp, sig, checkctty) 49539513Skarels struct pgrp *pgrp; 49647540Skarels int sig, checkctty; 49737581Smckusick { 49837581Smckusick register struct proc *p; 49937581Smckusick 50040807Smarc if (pgrp) 50140807Smarc for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) 50242207Smarc if (checkctty == 0 || p->p_flag&SCTTY) 50342207Smarc psignal(p, sig); 50437581Smckusick } 50537581Smckusick 5067421Sroot /* 50739513Skarels * Send a signal caused by a trap to the current process. 50839513Skarels * If it will be caught immediately, deliver it with correct code. 50939513Skarels * Otherwise, post it normally. 51039513Skarels */ 51147540Skarels void 51247540Skarels trapsignal(p, sig, code) 51347540Skarels struct proc *p; 51439513Skarels register int sig; 51539513Skarels unsigned code; 51639513Skarels { 51747540Skarels register struct sigacts *ps = p->p_sigacts; 51839513Skarels int mask; 51939513Skarels 52039513Skarels mask = sigmask(sig); 52139513Skarels if ((p->p_flag & STRC) == 0 && (p->p_sigcatch & mask) != 0 && 52239513Skarels (p->p_sigmask & mask) == 0) { 52347540Skarels p->p_stats->p_ru.ru_nsignals++; 52440807Smarc #ifdef KTRACE 52540807Smarc if (KTRPOINT(p, KTR_PSIG)) 52647540Skarels ktrpsig(p->p_tracep, sig, ps->ps_sigact[sig], 52740807Smarc p->p_sigmask, code); 52840807Smarc #endif 52947540Skarels sendsig(ps->ps_sigact[sig], sig, p->p_sigmask, code); 53047540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 53139513Skarels } else { 53247540Skarels ps->ps_code = code; /* XXX for core dump/debugger */ 53339513Skarels psignal(p, sig); 53439513Skarels } 53539513Skarels } 53639513Skarels 53739513Skarels /* 53840807Smarc * Send the specified signal to the specified process. 53947540Skarels * If the signal has an action, the action is usually performed 54047540Skarels * by the target process rather than the caller; we simply add 54147540Skarels * the signal to the set of pending signals for the process. 54240807Smarc * Exceptions: 54340807Smarc * o When a stop signal is sent to a sleeping process that takes the default 54440807Smarc * action, the process is stopped without awakening it. 54540807Smarc * o SIGCONT restarts stopped processes (or puts them back to sleep) 54640807Smarc * regardless of the signal action (eg, blocked or ignored). 54740807Smarc * Other ignored signals are discarded immediately. 5487421Sroot */ 54947540Skarels void 5507421Sroot psignal(p, sig) 5517421Sroot register struct proc *p; 5527421Sroot register int sig; 5537421Sroot { 55447540Skarels register int s, prop; 55539513Skarels register sig_t action; 55617153Sbloom int mask; 5577421Sroot 55839513Skarels if ((unsigned)sig >= NSIG || sig == 0) 55939513Skarels panic("psignal sig"); 56017153Sbloom mask = sigmask(sig); 56147540Skarels prop = sigprop[sig]; 5627421Sroot 5637421Sroot /* 5647421Sroot * If proc is traced, always give parent a chance. 5657421Sroot */ 5667421Sroot if (p->p_flag & STRC) 5677421Sroot action = SIG_DFL; 5687421Sroot else { 5697421Sroot /* 57012882Ssam * If the signal is being ignored, 57112882Ssam * then we forget about it immediately. 57239513Skarels * (Note: we don't set SIGCONT in p_sigignore, 57339513Skarels * and if it is set to SIG_IGN, 57439513Skarels * action will be SIG_DFL here.) 5757421Sroot */ 57617153Sbloom if (p->p_sigignore & mask) 5777421Sroot return; 57817153Sbloom if (p->p_sigmask & mask) 57912882Ssam action = SIG_HOLD; 58017153Sbloom else if (p->p_sigcatch & mask) 58112882Ssam action = SIG_CATCH; 58242437Skarels else 58312882Ssam action = SIG_DFL; 5847421Sroot } 5857421Sroot 58647540Skarels if (p->p_nice > NZERO && (sig == SIGKILL || 58747540Skarels sig == SIGTERM && (p->p_flag&STRC || action != SIG_DFL))) 58847540Skarels p->p_nice = NZERO; 5897421Sroot 59047540Skarels if (prop & SA_CONT) 59139513Skarels p->p_sig &= ~stopsigmask; 59239513Skarels 59347540Skarels if (prop & SA_STOP) { 59445672Skarels /* 59545672Skarels * If sending a tty stop signal to a member of an orphaned 59645672Skarels * process group, discard the signal here if the action 59745672Skarels * is default; don't stop the process below if sleeping, 59845672Skarels * and don't clear any pending SIGCONT. 59945672Skarels */ 60047540Skarels if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0 && 60147540Skarels action == SIG_DFL) 60245741Smckusick return; 60347540Skarels p->p_sig &= ~contsigmask; 6047421Sroot } 60539513Skarels p->p_sig |= mask; 60639513Skarels 6077421Sroot /* 60839513Skarels * Defer further processing for signals which are held, 60939513Skarels * except that stopped processes must be continued by SIGCONT. 6107421Sroot */ 61147540Skarels if (action == SIG_HOLD && ((prop & SA_CONT) == 0 || p->p_stat != SSTOP)) 6127421Sroot return; 61317153Sbloom s = splhigh(); 6147421Sroot switch (p->p_stat) { 6157421Sroot 6167421Sroot case SSLEEP: 6177421Sroot /* 61840807Smarc * If process is sleeping uninterruptibly 6197421Sroot * we can't interrupt the sleep... the signal will 6207421Sroot * be noticed when the process returns through 6217421Sroot * trap() or syscall(). 6227421Sroot */ 62340807Smarc if ((p->p_flag & SSINTR) == 0) 6247421Sroot goto out; 6257421Sroot /* 6267421Sroot * Process is sleeping and traced... make it runnable 6277421Sroot * so it can discover the signal in issig() and stop 6287421Sroot * for the parent. 6297421Sroot */ 6307421Sroot if (p->p_flag&STRC) 6317421Sroot goto run; 63239513Skarels /* 63339513Skarels * When a sleeping process receives a stop 63439513Skarels * signal, process immediately if possible. 63539513Skarels * All other (caught or default) signals 63639513Skarels * cause the process to run. 63739513Skarels */ 63847540Skarels if (prop & SA_STOP) { 6397421Sroot if (action != SIG_DFL) 64039513Skarels goto runfast; 6417421Sroot /* 64247540Skarels * If a child holding parent blocked, 64347540Skarels * stopping could cause deadlock. 6447421Sroot */ 64547540Skarels if (p->p_flag&SPPWAIT) 6467421Sroot goto out; 64717153Sbloom p->p_sig &= ~mask; 64843895Skarels p->p_xstat = sig; 64939513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 65039513Skarels psignal(p->p_pptr, SIGCHLD); 6517421Sroot stop(p); 6527421Sroot goto out; 65339513Skarels } else 65439513Skarels goto runfast; 6557421Sroot /*NOTREACHED*/ 6567421Sroot 6577421Sroot case SSTOP: 6587421Sroot /* 6597421Sroot * If traced process is already stopped, 6607421Sroot * then no further action is necessary. 6617421Sroot */ 6627421Sroot if (p->p_flag&STRC) 6637421Sroot goto out; 6647421Sroot 66547540Skarels /* 66647540Skarels * Kill signal always sets processes running. 66747540Skarels */ 66847540Skarels if (sig == SIGKILL) 66939513Skarels goto runfast; 6707421Sroot 67147540Skarels if (prop & SA_CONT) { 6727421Sroot /* 67339513Skarels * If SIGCONT is default (or ignored), we continue 67439513Skarels * the process but don't leave the signal in p_sig, 67539513Skarels * as it has no further action. If SIGCONT is held, 67639513Skarels * continue the process and leave the signal in p_sig. 6777421Sroot * If the process catches SIGCONT, let it handle 6787421Sroot * the signal itself. If it isn't waiting on 6797421Sroot * an event, then it goes back to run state. 6807421Sroot * Otherwise, process goes back to sleep state. 6817421Sroot */ 68239513Skarels if (action == SIG_DFL) 68339513Skarels p->p_sig &= ~mask; 68439513Skarels if (action == SIG_CATCH) 68539513Skarels goto runfast; 68639513Skarels if (p->p_wchan == 0) 6877421Sroot goto run; 6887421Sroot p->p_stat = SSLEEP; 6897421Sroot goto out; 69047540Skarels } 6917421Sroot 69247540Skarels if (prop & SA_STOP) { 6937421Sroot /* 6947421Sroot * Already stopped, don't need to stop again. 6957421Sroot * (If we did the shell could get confused.) 6967421Sroot */ 69717153Sbloom p->p_sig &= ~mask; /* take it away */ 6987421Sroot goto out; 6997421Sroot } 7007421Sroot 70147540Skarels /* 70247540Skarels * If process is sleeping interruptibly, then 70347540Skarels * simulate a wakeup so that when it is continued, 70447540Skarels * it will be made runnable and can look at the signal. 70547540Skarels * But don't setrun the process, leave it stopped. 70647540Skarels */ 70747540Skarels if (p->p_wchan && p->p_flag & SSINTR) 70847540Skarels unsleep(p); 70947540Skarels goto out; 71047540Skarels 7117421Sroot default: 7127421Sroot /* 7137421Sroot * SRUN, SIDL, SZOMB do nothing with the signal, 7147421Sroot * other than kicking ourselves if we are running. 7157421Sroot * It will either never be noticed, or noticed very soon. 7167421Sroot */ 71747650Skarels if (p == curproc) 71849102Skarels signotify(p); 7197421Sroot goto out; 7207421Sroot } 7217421Sroot /*NOTREACHED*/ 72239513Skarels 72339513Skarels runfast: 7247421Sroot /* 7257421Sroot * Raise priority to at least PUSER. 7267421Sroot */ 7277421Sroot if (p->p_pri > PUSER) 72817399Skarels p->p_pri = PUSER; 72939513Skarels run: 7307421Sroot setrun(p); 7317421Sroot out: 7327421Sroot splx(s); 7337421Sroot } 7347421Sroot 7357421Sroot /* 73640807Smarc * If the current process has a signal to process (should be caught 73740807Smarc * or cause termination, should interrupt current syscall), 73840807Smarc * return the signal number. Stop signals with default action 73940807Smarc * are processed immediately, then cleared; they aren't returned. 74047540Skarels * This is checked after each entry to the system for a syscall 74147540Skarels * or trap (though this can usually be done without actually calling 74247540Skarels * issig by checking the pending signal masks in the CURSIG macro.) 74347540Skarels * The normal call sequence is 74447540Skarels * 74547540Skarels * while (sig = CURSIG(curproc)) 74647540Skarels * psig(sig); 7477421Sroot */ 74847540Skarels issig(p) 74947540Skarels register struct proc *p; 7507421Sroot { 75147540Skarels register int sig, mask, prop; 7527421Sroot 7537421Sroot for (;;) { 75439513Skarels mask = p->p_sig &~ p->p_sigmask; 75547540Skarels if (p->p_flag&SPPWAIT) 75639513Skarels mask &= ~stopsigmask; 75740807Smarc if (mask == 0) /* no signal to send */ 75840807Smarc return (0); 75939513Skarels sig = ffs((long)mask); 76017153Sbloom mask = sigmask(sig); 76147540Skarels prop = sigprop[sig]; 76240807Smarc /* 76340807Smarc * We should see pending but ignored signals 76440807Smarc * only if STRC was on when they were posted. 76540807Smarc */ 76640807Smarc if (mask & p->p_sigignore && (p->p_flag&STRC) == 0) { 76740807Smarc p->p_sig &= ~mask; 76840807Smarc continue; 76940807Smarc } 77047540Skarels if (p->p_flag&STRC && (p->p_flag&SPPWAIT) == 0) { 7717421Sroot /* 7727421Sroot * If traced, always stop, and stay 7737421Sroot * stopped until released by the parent. 7747421Sroot */ 77543895Skarels p->p_xstat = sig; 77618331Skarels psignal(p->p_pptr, SIGCHLD); 7777421Sroot do { 7787421Sroot stop(p); 7797421Sroot swtch(); 78042926Smckusick } while (!procxmt(p) && p->p_flag&STRC); 7817421Sroot 7827421Sroot /* 78314782Ssam * If the traced bit got turned off, 78440807Smarc * go back up to the top to rescan signals. 78547650Skarels * This ensures that p_sig* and ps_sigact 78647650Skarels * are consistent. 7877421Sroot */ 78840807Smarc if ((p->p_flag&STRC) == 0) 7897421Sroot continue; 7907421Sroot 7917421Sroot /* 7927421Sroot * If parent wants us to take the signal, 79343895Skarels * then it will leave it in p->p_xstat; 7947421Sroot * otherwise we just look for signals again. 7957421Sroot */ 79640807Smarc p->p_sig &= ~mask; /* clear the old signal */ 79743895Skarels sig = p->p_xstat; 7987421Sroot if (sig == 0) 7997421Sroot continue; 80014782Ssam 80114782Ssam /* 80240807Smarc * Put the new signal into p_sig. 80340807Smarc * If signal is being masked, 80440807Smarc * look for other signals. 80514782Ssam */ 80617153Sbloom mask = sigmask(sig); 80740807Smarc p->p_sig |= mask; 80840807Smarc if (p->p_sigmask & mask) 80914782Ssam continue; 8107421Sroot } 81140807Smarc 81240807Smarc /* 81340807Smarc * Decide whether the signal should be returned. 81440807Smarc * Return the signal's number, or fall through 81540807Smarc * to clear it from the pending mask. 81640807Smarc */ 81747540Skarels switch ((int)p->p_sigacts->ps_sigact[sig]) { 8187421Sroot 8197421Sroot case SIG_DFL: 8207421Sroot /* 8217421Sroot * Don't take default actions on system processes. 8227421Sroot */ 82347540Skarels if (p->p_pid <= 1) 82440807Smarc break; /* == ignore */ 82540807Smarc /* 82640807Smarc * If there is a pending stop signal to process 82740807Smarc * with default action, stop here, 82842437Skarels * then clear the signal. However, 82942437Skarels * if process is member of an orphaned 83042437Skarels * process group, ignore tty stop signals. 83140807Smarc */ 83247540Skarels if (prop & SA_STOP) { 83342437Skarels if (p->p_flag&STRC || 83442437Skarels (p->p_pgrp->pg_jobc == 0 && 83547540Skarels prop & SA_TTYSTOP)) 83640807Smarc break; /* == ignore */ 83743895Skarels p->p_xstat = sig; 8387421Sroot stop(p); 83939513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 84039513Skarels psignal(p->p_pptr, SIGCHLD); 8417421Sroot swtch(); 84240807Smarc break; 84347540Skarels } else if (prop & SA_IGNORE) { 8447421Sroot /* 84539513Skarels * Except for SIGCONT, shouldn't get here. 84639513Skarels * Default action is to ignore; drop it. 8477421Sroot */ 84840807Smarc break; /* == ignore */ 84939513Skarels } else 85040807Smarc return (sig); 8517421Sroot /*NOTREACHED*/ 8527421Sroot 8537421Sroot case SIG_IGN: 8547421Sroot /* 85539513Skarels * Masking above should prevent us ever trying 85639513Skarels * to take action on an ignored signal other 85739513Skarels * than SIGCONT, unless process is traced. 8587421Sroot */ 85947540Skarels if ((prop & SA_CONT) == 0 && (p->p_flag&STRC) == 0) 8607421Sroot printf("issig\n"); 86140807Smarc break; /* == ignore */ 8627421Sroot 8637421Sroot default: 8647421Sroot /* 8657421Sroot * This signal has an action, let 8667421Sroot * psig process it. 8677421Sroot */ 86840807Smarc return (sig); 8697421Sroot } 87040807Smarc p->p_sig &= ~mask; /* take the signal! */ 8717421Sroot } 87240807Smarc /* NOTREACHED */ 8737421Sroot } 8747421Sroot 8757421Sroot /* 8767421Sroot * Put the argument process into the stopped 87718331Skarels * state and notify the parent via wakeup. 87818331Skarels * Signals are handled elsewhere. 87940807Smarc * The process must not be on the run queue. 8807421Sroot */ 8817421Sroot stop(p) 8827421Sroot register struct proc *p; 8837421Sroot { 8847421Sroot 8857421Sroot p->p_stat = SSTOP; 8867421Sroot p->p_flag &= ~SWTED; 8877421Sroot wakeup((caddr_t)p->p_pptr); 8887421Sroot } 8897421Sroot 8907421Sroot /* 89147540Skarels * Take the action for the specified signal 89247540Skarels * from the current set of pending signals. 8937421Sroot */ 89447540Skarels void 89540807Smarc psig(sig) 89640807Smarc register int sig; 8977421Sroot { 89847540Skarels register struct proc *p = curproc; 89947540Skarels register struct sigacts *ps = p->p_sigacts; 90047540Skarels register sig_t action; 90139513Skarels int mask, returnmask; 9027421Sroot 90340807Smarc #ifdef DIAGNOSTIC 90447540Skarels if (sig == 0) 90547540Skarels panic("psig"); 90640807Smarc #endif 90747540Skarels mask = sigmask(sig); 90847540Skarels p->p_sig &= ~mask; 90947540Skarels action = ps->ps_sigact[sig]; 91040807Smarc #ifdef KTRACE 91147540Skarels if (KTRPOINT(p, KTR_PSIG)) 91247540Skarels ktrpsig(p->p_tracep, sig, action, ps->ps_flags & SA_OLDMASK ? 91347540Skarels ps->ps_oldmask : p->p_sigmask, 0); 91440807Smarc #endif 91547540Skarels if (action == SIG_DFL) { 91647540Skarels /* 91747540Skarels * Default action, where the default is to kill 91847540Skarels * the process. (Other cases were ignored above.) 91947540Skarels */ 92047650Skarels sigexit(p, sig); 92147540Skarels /* NOTREACHED */ 92247540Skarels } else { 92347540Skarels /* 92447540Skarels * If we get here, the signal must be caught. 92547540Skarels */ 92639513Skarels #ifdef DIAGNOSTIC 92747540Skarels if (action == SIG_IGN || (p->p_sigmask & mask)) 92847540Skarels panic("psig action"); 92939513Skarels #endif 93047540Skarels /* 93147540Skarels * Set the new mask value and also defer further 93247540Skarels * occurences of this signal. 93347540Skarels * 93447540Skarels * Special case: user has done a sigpause. Here the 93547540Skarels * current mask is not of interest, but rather the 93647540Skarels * mask from before the sigpause is what we want 93747540Skarels * restored after the signal processing is completed. 93847540Skarels */ 93947540Skarels (void) splhigh(); 94047540Skarels if (ps->ps_flags & SA_OLDMASK) { 94147540Skarels returnmask = ps->ps_oldmask; 94247540Skarels ps->ps_flags &= ~SA_OLDMASK; 94347540Skarels } else 94447540Skarels returnmask = p->p_sigmask; 94547540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 94647540Skarels (void) spl0(); 94747540Skarels p->p_stats->p_ru.ru_nsignals++; 94847540Skarels sendsig(action, sig, returnmask, 0); 94947540Skarels } 9507421Sroot } 9517421Sroot 9527421Sroot /* 95347650Skarels * Force the current process to exit with the specified 95447650Skarels * signal, dumping core if appropriate. We bypass the normal 95547650Skarels * tests for masked and caught signals, allowing unrecoverable 95647650Skarels * failures to terminate the process without changing signal state. 95747650Skarels * Mark the accounting record with the signal termination. 95847650Skarels * If dumping core, save the signal number for the debugger. 95947650Skarels * Calls exit and does not return. 96047650Skarels */ 96147650Skarels sigexit(p, sig) 96247650Skarels register struct proc *p; 96347650Skarels int sig; 96447650Skarels { 96547650Skarels 96647650Skarels p->p_acflag |= AXSIG; 96747650Skarels if (sigprop[sig] & SA_CORE) { 96847650Skarels p->p_sigacts->ps_sig = sig; 96947650Skarels if (coredump(p) == 0) 97047650Skarels sig |= WCOREFLAG; 97147650Skarels } 97247650Skarels exit(p, W_EXITCODE(0, sig)); 97347650Skarels /* NOTREACHED */ 97447650Skarels } 97547650Skarels 97647650Skarels /* 97747540Skarels * Create a core dump. 978*50099Smckusick * The file name is "core.progname.pid". 979*50099Smckusick * Core dumps are not created if the process is setuid. 9807421Sroot */ 98147540Skarels coredump(p) 98247540Skarels register struct proc *p; 9837421Sroot { 98437728Smckusick register struct vnode *vp; 98547540Skarels register struct pcred *pcred = p->p_cred; 98647540Skarels register struct ucred *cred = pcred->pc_ucred; 98747540Skarels register struct vmspace *vm = p->p_vmspace; 98837580Smckusick struct vattr vattr; 98937580Smckusick int error; 99047540Skarels struct nameidata nd; 991*50099Smckusick char name[MAXCOMLEN+12]; /* core.progname.pid */ 9927421Sroot 99347540Skarels if (pcred->p_svuid != pcred->p_ruid || 99447540Skarels pcred->p_svgid != pcred->p_rgid) 99537580Smckusick return (EFAULT); 99647540Skarels if (ctob(UPAGES + vm->vm_dsize + vm->vm_ssize) >= 99747540Skarels p->p_rlimit[RLIMIT_CORE].rlim_cur) 99837580Smckusick return (EFAULT); 999*50099Smckusick sprintf(name, "core.%s.%d", p->p_comm, p->p_pid); 1000*50099Smckusick nd.ni_dirp = name; 100147540Skarels nd.ni_segflg = UIO_SYSSPACE; 100249913Smckusick if (error = vn_open(&nd, p, O_CREAT|FWRITE, 0644)) 100337580Smckusick return (error); 100447540Skarels vp = nd.ni_vp; 100548020Smckusick if (vp->v_type != VREG || VOP_GETATTR(vp, &vattr, cred, p) || 100637580Smckusick vattr.va_nlink != 1) { 100738394Smckusick vput(vp); 100838394Smckusick return (EFAULT); 10097818Sroot } 101041362Smckusick VATTR_NULL(&vattr); 101137580Smckusick vattr.va_size = 0; 101248020Smckusick VOP_SETATTR(vp, &vattr, cred, p); 101347540Skarels p->p_acflag |= ACORE; 101449102Skarels bcopy(p, &p->p_addr->u_kproc.kp_proc, sizeof(struct proc)); 101549102Skarels fill_eproc(p, &p->p_addr->u_kproc.kp_eproc); 101642004Smckusick #ifdef HPUXCOMPAT 101742004Smckusick /* 101842004Smckusick * BLETCH! If we loaded from an HPUX format binary file 101942004Smckusick * we have to dump an HPUX style user struct so that the 102042004Smckusick * HPUX debuggers can grok it. 102142004Smckusick */ 102249102Skarels if (p->p_addr->u_pcb.pcb_flags & PCB_HPUXBIN) 102347540Skarels error = hpuxdumpu(vp, cred); 102442004Smckusick else 102542004Smckusick #endif 102649102Skarels error = vn_rdwr(UIO_WRITE, vp, (caddr_t) p->p_addr, ctob(UPAGES), 102749102Skarels (off_t)0, UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, 102849102Skarels p); 102937580Smckusick if (error == 0) 103047540Skarels error = vn_rdwr(UIO_WRITE, vp, vm->vm_daddr, 103147540Skarels (int)ctob(vm->vm_dsize), (off_t)ctob(UPAGES), UIO_USERSPACE, 103249102Skarels IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, p); 103337580Smckusick if (error == 0) 103437580Smckusick error = vn_rdwr(UIO_WRITE, vp, 103549102Skarels (caddr_t) trunc_page(USRSTACK - ctob(vm->vm_ssize)), 103647540Skarels round_page(ctob(vm->vm_ssize)), 103747540Skarels (off_t)ctob(UPAGES) + ctob(vm->vm_dsize), UIO_USERSPACE, 103849102Skarels IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, p); 103938394Smckusick vput(vp); 104037580Smckusick return (error); 10417421Sroot } 104239513Skarels 104339513Skarels /* 104439513Skarels * Nonexistent system call-- signal process (may want to handle it). 104539513Skarels * Flag error in case process won't see signal immediately (blocked or ignored). 104639513Skarels */ 104743364Smckusick /* ARGSUSED */ 104843364Smckusick nosys(p, args, retval) 104943364Smckusick struct proc *p; 105043364Smckusick void *args; 105143364Smckusick int *retval; 105239513Skarels { 105339513Skarels 105443364Smckusick psignal(p, SIGSYS); 105544405Skarels return (EINVAL); 105639513Skarels } 1057