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*48020Smckusick * @(#)kern_sig.c 7.29 (Berkeley) 04/15/91 823374Smckusick */ 97421Sroot 1047540Skarels #define SIGPROP /* include signal properties table */ 1117092Sbloom #include "param.h" 1247650Skarels #include "signalvar.h" 1347650Skarels #include "resourcevar.h" 14*48020Smckusick #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 2847650Skarels #include "vm/vm.h" 2947650Skarels #include "kinfo_proc.h" 3047650Skarels #include "user.h" /* for coredump */ 3137581Smckusick 3217013Smckusick /* 3347540Skarels * Can process p, with pcred pc, send the signal signo to process q? 3417013Smckusick */ 3547540Skarels #define CANSIGNAL(p, pc, q, signo) \ 3647540Skarels ((pc)->pc_ucred->cr_uid == 0 || \ 3747540Skarels (pc)->p_ruid == (q)->p_cred->p_ruid || \ 3847540Skarels (pc)->pc_ucred->cr_uid == (q)->p_cred->p_ruid || \ 3947540Skarels (pc)->p_ruid == (q)->p_ucred->cr_uid || \ 4047540Skarels (pc)->pc_ucred->cr_uid == (q)->p_ucred->cr_uid || \ 4142920Skarels ((signo) == SIGCONT && (q)->p_session == (p)->p_session)) 4239513Skarels 4342920Skarels /* ARGSUSED */ 4442920Skarels sigaction(p, uap, retval) 4542920Skarels struct proc *p; 4642920Skarels register struct args { 4712882Ssam int signo; 4839513Skarels struct sigaction *nsa; 4939513Skarels struct sigaction *osa; 5042920Skarels } *uap; 5142920Skarels int *retval; 5242920Skarels { 5339513Skarels struct sigaction vec; 5439513Skarels register struct sigaction *sa; 5547540Skarels register struct sigacts *ps = p->p_sigacts; 5612882Ssam register int sig; 5739513Skarels int bit, error; 587421Sroot 5912882Ssam sig = uap->signo; 6039513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 6144405Skarels return (EINVAL); 6239513Skarels sa = &vec; 6339513Skarels if (uap->osa) { 6447540Skarels sa->sa_handler = ps->ps_sigact[sig]; 6547540Skarels sa->sa_mask = ps->ps_catchmask[sig]; 6618308Smckusick bit = sigmask(sig); 6739513Skarels sa->sa_flags = 0; 6847540Skarels if ((ps->ps_sigonstack & bit) != 0) 6939513Skarels sa->sa_flags |= SA_ONSTACK; 7047540Skarels if ((ps->ps_sigintr & bit) == 0) 7139513Skarels sa->sa_flags |= SA_RESTART; 7242920Skarels if (p->p_flag & SNOCLDSTOP) 7339513Skarels sa->sa_flags |= SA_NOCLDSTOP; 7439513Skarels if (error = copyout((caddr_t)sa, (caddr_t)uap->osa, 7539513Skarels sizeof (vec))) 7644405Skarels return (error); 7712951Ssam } 7839513Skarels if (uap->nsa) { 7939513Skarels if (error = copyin((caddr_t)uap->nsa, (caddr_t)sa, 8039513Skarels sizeof (vec))) 8144405Skarels return (error); 8242920Skarels setsigvec(p, sig, sa); 8312951Ssam } 8444405Skarels return (0); 857421Sroot } 867421Sroot 8742920Skarels setsigvec(p, sig, sa) 8842920Skarels register struct proc *p; 8912951Ssam int sig; 9039513Skarels register struct sigaction *sa; 9112882Ssam { 9247540Skarels register struct sigacts *ps = p->p_sigacts; 9312951Ssam register int bit; 9412882Ssam 9517153Sbloom bit = sigmask(sig); 9612882Ssam /* 9712882Ssam * Change setting atomically. 9812882Ssam */ 9917153Sbloom (void) splhigh(); 10047540Skarels ps->ps_sigact[sig] = sa->sa_handler; 10147540Skarels ps->ps_catchmask[sig] = sa->sa_mask &~ sigcantmask; 10239513Skarels if ((sa->sa_flags & SA_RESTART) == 0) 10347540Skarels ps->ps_sigintr |= bit; 10418308Smckusick else 10547540Skarels ps->ps_sigintr &= ~bit; 10639513Skarels if (sa->sa_flags & SA_ONSTACK) 10747540Skarels ps->ps_sigonstack |= bit; 10812951Ssam else 10947540Skarels ps->ps_sigonstack &= ~bit; 11039513Skarels if (sig == SIGCHLD) { 11139513Skarels if (sa->sa_flags & SA_NOCLDSTOP) 11239513Skarels p->p_flag |= SNOCLDSTOP; 11339513Skarels else 11439513Skarels p->p_flag &= ~SNOCLDSTOP; 11539513Skarels } 11639513Skarels /* 11739513Skarels * Set bit in p_sigignore for signals that are set to SIG_IGN, 11839513Skarels * and for signals set to SIG_DFL where the default is to ignore. 11939513Skarels * However, don't put SIGCONT in p_sigignore, 12039513Skarels * as we have to restart the process. 12139513Skarels */ 12239513Skarels if (sa->sa_handler == SIG_IGN || 12347540Skarels (sigprop[sig] & SA_IGNORE && sa->sa_handler == SIG_DFL)) { 12412951Ssam p->p_sig &= ~bit; /* never to be seen again */ 12539513Skarels if (sig != SIGCONT) 12639513Skarels p->p_sigignore |= bit; /* easier in psignal */ 12712951Ssam p->p_sigcatch &= ~bit; 12812882Ssam } else { 12912951Ssam p->p_sigignore &= ~bit; 13039513Skarels if (sa->sa_handler == SIG_DFL) 13112951Ssam p->p_sigcatch &= ~bit; 13212882Ssam else 13312951Ssam p->p_sigcatch |= bit; 13412882Ssam } 13512882Ssam (void) spl0(); 13612882Ssam } 13712882Ssam 13839513Skarels /* 13939513Skarels * Initialize signal state for process 0; 14039513Skarels * set to ignore signals that are ignored by default. 14139513Skarels */ 14247540Skarels void 14339513Skarels siginit(p) 14439513Skarels struct proc *p; 1457421Sroot { 14647540Skarels register int i; 14739513Skarels 14847540Skarels for (i = 0; i < NSIG; i++) 14947540Skarels if (sigprop[i] & SA_IGNORE && i != SIGCONT) 15047540Skarels p->p_sigignore |= sigmask(i); 15139513Skarels } 15239513Skarels 15339513Skarels /* 15439513Skarels * Reset signals for an exec of the specified process. 15539513Skarels */ 15647540Skarels void 15739513Skarels execsigs(p) 15839513Skarels register struct proc *p; 15939513Skarels { 16047540Skarels register struct sigacts *ps = p->p_sigacts; 16139513Skarels register int nc, mask; 16239513Skarels 16339513Skarels /* 16439513Skarels * Reset caught signals. Held signals remain held 16539513Skarels * through p_sigmask (unless they were caught, 16639513Skarels * and are now ignored by default). 16739513Skarels */ 16839513Skarels while (p->p_sigcatch) { 16939513Skarels nc = ffs((long)p->p_sigcatch); 17039513Skarels mask = sigmask(nc); 17139513Skarels p->p_sigcatch &= ~mask; 17247540Skarels if (sigprop[nc] & SA_IGNORE) { 17339513Skarels if (nc != SIGCONT) 17439513Skarels p->p_sigignore |= mask; 17539513Skarels p->p_sig &= ~mask; 17639513Skarels } 17747540Skarels ps->ps_sigact[nc] = SIG_DFL; 17839513Skarels } 17939513Skarels /* 18039513Skarels * Reset stack state to the user stack. 18139513Skarels * Clear set of signals caught on the signal stack. 18239513Skarels */ 18347540Skarels ps->ps_onstack = 0; 18447540Skarels ps->ps_sigsp = 0; 18547540Skarels ps->ps_sigonstack = 0; 18639513Skarels } 18739513Skarels 18839513Skarels /* 18939513Skarels * Manipulate signal mask. 19039513Skarels * Note that we receive new mask, not pointer, 19139513Skarels * and return old mask as return value; 19239513Skarels * the library stub does the rest. 19339513Skarels */ 19442920Skarels sigprocmask(p, uap, retval) 19542920Skarels register struct proc *p; 19642920Skarels struct args { 19739513Skarels int how; 19839513Skarels sigset_t mask; 19942920Skarels } *uap; 20042920Skarels int *retval; 20142920Skarels { 20239513Skarels int error = 0; 20339513Skarels 20442920Skarels *retval = p->p_sigmask; 20539513Skarels (void) splhigh(); 20639513Skarels 20739513Skarels switch (uap->how) { 20839513Skarels case SIG_BLOCK: 20939513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 21039513Skarels break; 21139513Skarels 21239513Skarels case SIG_UNBLOCK: 21339513Skarels p->p_sigmask &= ~uap->mask; 21439513Skarels break; 21539513Skarels 21639513Skarels case SIG_SETMASK: 21739513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 21839513Skarels break; 21939513Skarels 22039513Skarels default: 22139513Skarels error = EINVAL; 22239513Skarels break; 22339513Skarels } 22439513Skarels (void) spl0(); 22544405Skarels return (error); 22639513Skarels } 22739513Skarels 22842920Skarels /* ARGSUSED */ 22942920Skarels sigpending(p, uap, retval) 23042920Skarels struct proc *p; 23142920Skarels void *uap; 23242920Skarels int *retval; 23339513Skarels { 23439513Skarels 23542920Skarels *retval = p->p_sig; 23644405Skarels return (0); 23739513Skarels } 23839513Skarels 23939513Skarels #ifdef COMPAT_43 24039513Skarels /* 24139513Skarels * Generalized interface signal handler, 4.3-compatible. 24239513Skarels */ 24342920Skarels /* ARGSUSED */ 24442920Skarels osigvec(p, uap, retval) 24542920Skarels struct proc *p; 24642920Skarels register struct args { 24739513Skarels int signo; 24839513Skarels struct sigvec *nsv; 24939513Skarels struct sigvec *osv; 25042920Skarels } *uap; 25142920Skarels int *retval; 25242920Skarels { 25339513Skarels struct sigvec vec; 25447540Skarels register struct sigacts *ps = p->p_sigacts; 25539513Skarels register struct sigvec *sv; 25639513Skarels register int sig; 25739513Skarels int bit, error; 25839513Skarels 25939513Skarels sig = uap->signo; 26039513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 26144405Skarels return (EINVAL); 26239513Skarels sv = &vec; 26339513Skarels if (uap->osv) { 26447540Skarels *(sig_t *)&sv->sv_handler = ps->ps_sigact[sig]; 26547540Skarels sv->sv_mask = ps->ps_catchmask[sig]; 26639513Skarels bit = sigmask(sig); 26739513Skarels sv->sv_flags = 0; 26847540Skarels if ((ps->ps_sigonstack & bit) != 0) 26939513Skarels sv->sv_flags |= SV_ONSTACK; 27047540Skarels if ((ps->ps_sigintr & bit) != 0) 27139513Skarels sv->sv_flags |= SV_INTERRUPT; 27242920Skarels if (p->p_flag & SNOCLDSTOP) 27339513Skarels sv->sv_flags |= SA_NOCLDSTOP; 27439513Skarels if (error = copyout((caddr_t)sv, (caddr_t)uap->osv, 27539513Skarels sizeof (vec))) 27644405Skarels return (error); 27739513Skarels } 27839513Skarels if (uap->nsv) { 27939513Skarels if (error = copyin((caddr_t)uap->nsv, (caddr_t)sv, 28039513Skarels sizeof (vec))) 28144405Skarels return (error); 28239513Skarels sv->sv_flags ^= SA_RESTART; /* opposite of SV_INTERRUPT */ 28342920Skarels setsigvec(p, sig, (struct sigaction *)sv); 28439513Skarels } 28544405Skarels return (0); 28639513Skarels } 28739513Skarels 28842920Skarels osigblock(p, uap, retval) 28942920Skarels register struct proc *p; 29042920Skarels struct args { 29142920Skarels int mask; 29242920Skarels } *uap; 29342920Skarels int *retval; 29439513Skarels { 2957499Sroot 29617153Sbloom (void) splhigh(); 29742920Skarels *retval = p->p_sigmask; 29839513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 29912882Ssam (void) spl0(); 30044405Skarels return (0); 3017499Sroot } 3027499Sroot 30342920Skarels osigsetmask(p, uap, retval) 30442920Skarels struct proc *p; 30542920Skarels struct args { 30642920Skarels int mask; 30742920Skarels } *uap; 30842920Skarels int *retval; 3097499Sroot { 3107499Sroot 31117153Sbloom (void) splhigh(); 31242920Skarels *retval = p->p_sigmask; 31339513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 31412882Ssam (void) spl0(); 31544405Skarels return (0); 3167499Sroot } 31739513Skarels #endif 3187499Sroot 31939513Skarels /* 32039513Skarels * Suspend process until signal, providing mask to be set 32139513Skarels * in the meantime. Note nonstandard calling convention: 32239513Skarels * libc stub passes mask, not pointer, to save a copyin. 32339513Skarels */ 32442920Skarels /* ARGSUSED */ 32542920Skarels sigsuspend(p, uap, retval) 32642920Skarels register struct proc *p; 32742920Skarels struct args { 32842920Skarels sigset_t mask; 32942920Skarels } *uap; 33042920Skarels int *retval; 3317499Sroot { 33247540Skarels register struct sigacts *ps = p->p_sigacts; 3337499Sroot 33412882Ssam /* 33512882Ssam * When returning from sigpause, we want 33612882Ssam * the old mask to be restored after the 33712882Ssam * signal handler has finished. Thus, we 33812882Ssam * save it here and mark the proc structure 33947540Skarels * to indicate this (should be in sigacts). 34012882Ssam */ 34147540Skarels ps->ps_oldmask = p->p_sigmask; 34247540Skarels ps->ps_flags |= SA_OLDMASK; 34339513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 34447540Skarels (void) tsleep((caddr_t) ps, PPAUSE|PCATCH, "pause", 0); 34540807Smarc /* always return EINTR rather than ERESTART... */ 34644405Skarels return (EINTR); 3477499Sroot } 3487499Sroot 34942920Skarels /* ARGSUSED */ 35042920Skarels sigstack(p, uap, retval) 35142920Skarels struct proc *p; 35242920Skarels register struct args { 35312951Ssam struct sigstack *nss; 35412951Ssam struct sigstack *oss; 35542920Skarels } *uap; 35642920Skarels int *retval; 35742920Skarels { 35812951Ssam struct sigstack ss; 35939513Skarels int error = 0; 3607499Sroot 36147540Skarels if (uap->oss && (error = copyout((caddr_t)&p->p_sigacts->ps_sigstack, 36239513Skarels (caddr_t)uap->oss, sizeof (struct sigstack)))) 36344405Skarels return (error); 36439513Skarels if (uap->nss && (error = copyin((caddr_t)uap->nss, (caddr_t)&ss, 36539513Skarels sizeof (ss))) == 0) 36647540Skarels p->p_sigacts->ps_sigstack = ss; 36744405Skarels return (error); 3687499Sroot } 3697499Sroot 37042920Skarels /* ARGSUSED */ 37142920Skarels kill(cp, uap, retval) 37242920Skarels register struct proc *cp; 37342920Skarels register struct args { 37412882Ssam int pid; 37512882Ssam int signo; 37642920Skarels } *uap; 37742920Skarels int *retval; 37842920Skarels { 37918336Smckusick register struct proc *p; 38047540Skarels register struct pcred *pc = cp->p_cred; 3818032Sroot 38239513Skarels if ((unsigned) uap->signo >= NSIG) 38344405Skarels return (EINVAL); 38418336Smckusick if (uap->pid > 0) { 38518336Smckusick /* kill single process */ 38618336Smckusick p = pfind(uap->pid); 38739513Skarels if (p == 0) 38844405Skarels return (ESRCH); 38947540Skarels if (!CANSIGNAL(cp, pc, p, uap->signo)) 39044405Skarels return (EPERM); 39139513Skarels if (uap->signo) 39218336Smckusick psignal(p, uap->signo); 39344405Skarels return (0); 39418336Smckusick } 39518336Smckusick switch (uap->pid) { 39618336Smckusick case -1: /* broadcast signal */ 39744405Skarels return (killpg1(cp, uap->signo, 0, 1)); 39818336Smckusick case 0: /* signal own process group */ 39944405Skarels return (killpg1(cp, uap->signo, 0, 0)); 40018336Smckusick default: /* negative explicit process group */ 40144405Skarels return (killpg1(cp, uap->signo, -uap->pid, 0)); 40218336Smckusick } 40339513Skarels /* NOTREACHED */ 4048032Sroot } 4058032Sroot 40639513Skarels #ifdef COMPAT_43 40742920Skarels /* ARGSUSED */ 40842920Skarels okillpg(p, uap, retval) 40942920Skarels struct proc *p; 41042920Skarels register struct args { 41137581Smckusick int pgid; 4129989Ssam int signo; 41342920Skarels } *uap; 41442920Skarels int *retval; 41542920Skarels { 4168032Sroot 41739513Skarels if ((unsigned) uap->signo >= NSIG) 41844405Skarels return (EINVAL); 41944405Skarels return (killpg1(p, uap->signo, uap->pgid, 0)); 4208032Sroot } 42139513Skarels #endif 4228032Sroot 42342920Skarels /* 42442920Skarels * Common code for kill process group/broadcast kill. 42542920Skarels * cp is calling process. 42642920Skarels */ 42742920Skarels killpg1(cp, signo, pgid, all) 42842920Skarels register struct proc *cp; 42937581Smckusick int signo, pgid, all; 4309989Ssam { 4319989Ssam register struct proc *p; 43247540Skarels register struct pcred *pc = cp->p_cred; 43337581Smckusick struct pgrp *pgrp; 43447540Skarels int nfound = 0; 43537581Smckusick 43637581Smckusick if (all) 43737581Smckusick /* 43837581Smckusick * broadcast 4397421Sroot */ 44037581Smckusick for (p = allproc; p != NULL; p = p->p_nxt) { 44147540Skarels if (p->p_pid <= 1 || p->p_flag&SSYS || 44247540Skarels p == cp || !CANSIGNAL(cp, pc, p, signo)) 44337581Smckusick continue; 44447540Skarels nfound++; 44537581Smckusick if (signo) 44637581Smckusick psignal(p, signo); 44737581Smckusick } 44837581Smckusick else { 44937581Smckusick if (pgid == 0) 45037581Smckusick /* 45137581Smckusick * zero pgid means send to my process group. 45237581Smckusick */ 45347540Skarels pgrp = cp->p_pgrp; 45437581Smckusick else { 45537581Smckusick pgrp = pgfind(pgid); 45637581Smckusick if (pgrp == NULL) 45739513Skarels return (ESRCH); 45837581Smckusick } 45937581Smckusick for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) { 46047540Skarels if (p->p_pid <= 1 || p->p_flag&SSYS || 46147540Skarels !CANSIGNAL(cp, pc, p, signo)) 46237581Smckusick continue; 46347540Skarels nfound++; 46437581Smckusick if (signo) 46537581Smckusick psignal(p, signo); 46618336Smckusick } 4677421Sroot } 46847540Skarels return (nfound ? 0 : ESRCH); 4697421Sroot } 4707421Sroot 47142920Skarels /* 4727421Sroot * Send the specified signal to 47337581Smckusick * all processes with 'pgid' as 4747421Sroot * process group. 4757421Sroot */ 47647540Skarels void 47737581Smckusick gsignal(pgid, sig) 47847540Skarels int pgid, sig; 4797421Sroot { 48039513Skarels struct pgrp *pgrp; 4817421Sroot 48239513Skarels if (pgid && (pgrp = pgfind(pgid))) 48342207Smarc pgsignal(pgrp, sig, 0); 4847421Sroot } 48542920Skarels 48640807Smarc /* 48742207Smarc * Send sig to every member of a process group. 48842207Smarc * If checktty is 1, limit to members which have a controlling 48942207Smarc * terminal. 49040807Smarc */ 49147540Skarels void 49242207Smarc pgsignal(pgrp, sig, checkctty) 49339513Skarels struct pgrp *pgrp; 49447540Skarels int sig, checkctty; 49537581Smckusick { 49637581Smckusick register struct proc *p; 49737581Smckusick 49840807Smarc if (pgrp) 49940807Smarc for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) 50042207Smarc if (checkctty == 0 || p->p_flag&SCTTY) 50142207Smarc psignal(p, sig); 50237581Smckusick } 50337581Smckusick 5047421Sroot /* 50539513Skarels * Send a signal caused by a trap to the current process. 50639513Skarels * If it will be caught immediately, deliver it with correct code. 50739513Skarels * Otherwise, post it normally. 50839513Skarels */ 50947540Skarels void 51047540Skarels trapsignal(p, sig, code) 51147540Skarels struct proc *p; 51239513Skarels register int sig; 51339513Skarels unsigned code; 51439513Skarels { 51547540Skarels register struct sigacts *ps = p->p_sigacts; 51639513Skarels int mask; 51739513Skarels 51839513Skarels mask = sigmask(sig); 51939513Skarels if ((p->p_flag & STRC) == 0 && (p->p_sigcatch & mask) != 0 && 52039513Skarels (p->p_sigmask & mask) == 0) { 52147540Skarels p->p_stats->p_ru.ru_nsignals++; 52240807Smarc #ifdef KTRACE 52340807Smarc if (KTRPOINT(p, KTR_PSIG)) 52447540Skarels ktrpsig(p->p_tracep, sig, ps->ps_sigact[sig], 52540807Smarc p->p_sigmask, code); 52640807Smarc #endif 52747540Skarels sendsig(ps->ps_sigact[sig], sig, p->p_sigmask, code); 52847540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 52939513Skarels } else { 53047540Skarels ps->ps_code = code; /* XXX for core dump/debugger */ 53139513Skarels psignal(p, sig); 53239513Skarels } 53339513Skarels } 53439513Skarels 53539513Skarels /* 53640807Smarc * Send the specified signal to the specified process. 53747540Skarels * If the signal has an action, the action is usually performed 53847540Skarels * by the target process rather than the caller; we simply add 53947540Skarels * the signal to the set of pending signals for the process. 54040807Smarc * Exceptions: 54140807Smarc * o When a stop signal is sent to a sleeping process that takes the default 54240807Smarc * action, the process is stopped without awakening it. 54340807Smarc * o SIGCONT restarts stopped processes (or puts them back to sleep) 54440807Smarc * regardless of the signal action (eg, blocked or ignored). 54540807Smarc * Other ignored signals are discarded immediately. 5467421Sroot */ 54747540Skarels void 5487421Sroot psignal(p, sig) 5497421Sroot register struct proc *p; 5507421Sroot register int sig; 5517421Sroot { 55247540Skarels register int s, prop; 55339513Skarels register sig_t action; 55417153Sbloom int mask; 5557421Sroot 55639513Skarels if ((unsigned)sig >= NSIG || sig == 0) 55739513Skarels panic("psignal sig"); 55817153Sbloom mask = sigmask(sig); 55947540Skarels prop = sigprop[sig]; 5607421Sroot 5617421Sroot /* 5627421Sroot * If proc is traced, always give parent a chance. 5637421Sroot */ 5647421Sroot if (p->p_flag & STRC) 5657421Sroot action = SIG_DFL; 5667421Sroot else { 5677421Sroot /* 56812882Ssam * If the signal is being ignored, 56912882Ssam * then we forget about it immediately. 57039513Skarels * (Note: we don't set SIGCONT in p_sigignore, 57139513Skarels * and if it is set to SIG_IGN, 57239513Skarels * action will be SIG_DFL here.) 5737421Sroot */ 57417153Sbloom if (p->p_sigignore & mask) 5757421Sroot return; 57617153Sbloom if (p->p_sigmask & mask) 57712882Ssam action = SIG_HOLD; 57817153Sbloom else if (p->p_sigcatch & mask) 57912882Ssam action = SIG_CATCH; 58042437Skarels else 58112882Ssam action = SIG_DFL; 5827421Sroot } 5837421Sroot 58447540Skarels if (p->p_nice > NZERO && (sig == SIGKILL || 58547540Skarels sig == SIGTERM && (p->p_flag&STRC || action != SIG_DFL))) 58647540Skarels p->p_nice = NZERO; 5877421Sroot 58847540Skarels if (prop & SA_CONT) 58939513Skarels p->p_sig &= ~stopsigmask; 59039513Skarels 59147540Skarels if (prop & SA_STOP) { 59245672Skarels /* 59345672Skarels * If sending a tty stop signal to a member of an orphaned 59445672Skarels * process group, discard the signal here if the action 59545672Skarels * is default; don't stop the process below if sleeping, 59645672Skarels * and don't clear any pending SIGCONT. 59745672Skarels */ 59847540Skarels if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0 && 59947540Skarels action == SIG_DFL) 60045741Smckusick return; 60147540Skarels p->p_sig &= ~contsigmask; 6027421Sroot } 60339513Skarels p->p_sig |= mask; 60439513Skarels 6057421Sroot /* 60639513Skarels * Defer further processing for signals which are held, 60739513Skarels * except that stopped processes must be continued by SIGCONT. 6087421Sroot */ 60947540Skarels if (action == SIG_HOLD && ((prop & SA_CONT) == 0 || p->p_stat != SSTOP)) 6107421Sroot return; 61117153Sbloom s = splhigh(); 6127421Sroot switch (p->p_stat) { 6137421Sroot 6147421Sroot case SSLEEP: 6157421Sroot /* 61640807Smarc * If process is sleeping uninterruptibly 6177421Sroot * we can't interrupt the sleep... the signal will 6187421Sroot * be noticed when the process returns through 6197421Sroot * trap() or syscall(). 6207421Sroot */ 62140807Smarc if ((p->p_flag & SSINTR) == 0) 6227421Sroot goto out; 6237421Sroot /* 6247421Sroot * Process is sleeping and traced... make it runnable 6257421Sroot * so it can discover the signal in issig() and stop 6267421Sroot * for the parent. 6277421Sroot */ 6287421Sroot if (p->p_flag&STRC) 6297421Sroot goto run; 63039513Skarels /* 63139513Skarels * When a sleeping process receives a stop 63239513Skarels * signal, process immediately if possible. 63339513Skarels * All other (caught or default) signals 63439513Skarels * cause the process to run. 63539513Skarels */ 63647540Skarels if (prop & SA_STOP) { 6377421Sroot if (action != SIG_DFL) 63839513Skarels goto runfast; 6397421Sroot /* 64047540Skarels * If a child holding parent blocked, 64147540Skarels * stopping could cause deadlock. 6427421Sroot */ 64347540Skarels if (p->p_flag&SPPWAIT) 6447421Sroot goto out; 64517153Sbloom p->p_sig &= ~mask; 64643895Skarels p->p_xstat = sig; 64739513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 64839513Skarels psignal(p->p_pptr, SIGCHLD); 6497421Sroot stop(p); 6507421Sroot goto out; 65139513Skarels } else 65239513Skarels goto runfast; 6537421Sroot /*NOTREACHED*/ 6547421Sroot 6557421Sroot case SSTOP: 6567421Sroot /* 6577421Sroot * If traced process is already stopped, 6587421Sroot * then no further action is necessary. 6597421Sroot */ 6607421Sroot if (p->p_flag&STRC) 6617421Sroot goto out; 6627421Sroot 66347540Skarels /* 66447540Skarels * Kill signal always sets processes running. 66547540Skarels */ 66647540Skarels if (sig == SIGKILL) 66739513Skarels goto runfast; 6687421Sroot 66947540Skarels if (prop & SA_CONT) { 6707421Sroot /* 67139513Skarels * If SIGCONT is default (or ignored), we continue 67239513Skarels * the process but don't leave the signal in p_sig, 67339513Skarels * as it has no further action. If SIGCONT is held, 67439513Skarels * continue the process and leave the signal in p_sig. 6757421Sroot * If the process catches SIGCONT, let it handle 6767421Sroot * the signal itself. If it isn't waiting on 6777421Sroot * an event, then it goes back to run state. 6787421Sroot * Otherwise, process goes back to sleep state. 6797421Sroot */ 68039513Skarels if (action == SIG_DFL) 68139513Skarels p->p_sig &= ~mask; 68239513Skarels if (action == SIG_CATCH) 68339513Skarels goto runfast; 68439513Skarels if (p->p_wchan == 0) 6857421Sroot goto run; 6867421Sroot p->p_stat = SSLEEP; 6877421Sroot goto out; 68847540Skarels } 6897421Sroot 69047540Skarels if (prop & SA_STOP) { 6917421Sroot /* 6927421Sroot * Already stopped, don't need to stop again. 6937421Sroot * (If we did the shell could get confused.) 6947421Sroot */ 69517153Sbloom p->p_sig &= ~mask; /* take it away */ 6967421Sroot goto out; 6977421Sroot } 6987421Sroot 69947540Skarels /* 70047540Skarels * If process is sleeping interruptibly, then 70147540Skarels * simulate a wakeup so that when it is continued, 70247540Skarels * it will be made runnable and can look at the signal. 70347540Skarels * But don't setrun the process, leave it stopped. 70447540Skarels */ 70547540Skarels if (p->p_wchan && p->p_flag & SSINTR) 70647540Skarels unsleep(p); 70747540Skarels goto out; 70847540Skarels 7097421Sroot default: 7107421Sroot /* 7117421Sroot * SRUN, SIDL, SZOMB do nothing with the signal, 7127421Sroot * other than kicking ourselves if we are running. 7137421Sroot * It will either never be noticed, or noticed very soon. 7147421Sroot */ 71547650Skarels if (p == curproc) 7167421Sroot aston(); 7177421Sroot goto out; 7187421Sroot } 7197421Sroot /*NOTREACHED*/ 72039513Skarels 72139513Skarels runfast: 7227421Sroot /* 7237421Sroot * Raise priority to at least PUSER. 7247421Sroot */ 7257421Sroot if (p->p_pri > PUSER) 72617399Skarels p->p_pri = PUSER; 72739513Skarels run: 7287421Sroot setrun(p); 7297421Sroot out: 7307421Sroot splx(s); 7317421Sroot } 7327421Sroot 7337421Sroot /* 73440807Smarc * If the current process has a signal to process (should be caught 73540807Smarc * or cause termination, should interrupt current syscall), 73640807Smarc * return the signal number. Stop signals with default action 73740807Smarc * are processed immediately, then cleared; they aren't returned. 73847540Skarels * This is checked after each entry to the system for a syscall 73947540Skarels * or trap (though this can usually be done without actually calling 74047540Skarels * issig by checking the pending signal masks in the CURSIG macro.) 74147540Skarels * The normal call sequence is 74247540Skarels * 74347540Skarels * while (sig = CURSIG(curproc)) 74447540Skarels * psig(sig); 7457421Sroot */ 74647540Skarels issig(p) 74747540Skarels register struct proc *p; 7487421Sroot { 74947540Skarels register int sig, mask, prop; 7507421Sroot 7517421Sroot for (;;) { 75239513Skarels mask = p->p_sig &~ p->p_sigmask; 75347540Skarels if (p->p_flag&SPPWAIT) 75439513Skarels mask &= ~stopsigmask; 75540807Smarc if (mask == 0) /* no signal to send */ 75640807Smarc return (0); 75739513Skarels sig = ffs((long)mask); 75817153Sbloom mask = sigmask(sig); 75947540Skarels prop = sigprop[sig]; 76040807Smarc /* 76140807Smarc * We should see pending but ignored signals 76240807Smarc * only if STRC was on when they were posted. 76340807Smarc */ 76440807Smarc if (mask & p->p_sigignore && (p->p_flag&STRC) == 0) { 76540807Smarc p->p_sig &= ~mask; 76640807Smarc continue; 76740807Smarc } 76847540Skarels if (p->p_flag&STRC && (p->p_flag&SPPWAIT) == 0) { 7697421Sroot /* 7707421Sroot * If traced, always stop, and stay 7717421Sroot * stopped until released by the parent. 7727421Sroot */ 77343895Skarels p->p_xstat = sig; 77418331Skarels psignal(p->p_pptr, SIGCHLD); 7757421Sroot do { 7767421Sroot stop(p); 7777421Sroot swtch(); 77842926Smckusick } while (!procxmt(p) && p->p_flag&STRC); 7797421Sroot 7807421Sroot /* 78114782Ssam * If the traced bit got turned off, 78240807Smarc * go back up to the top to rescan signals. 78347650Skarels * This ensures that p_sig* and ps_sigact 78447650Skarels * are consistent. 7857421Sroot */ 78640807Smarc if ((p->p_flag&STRC) == 0) 7877421Sroot continue; 7887421Sroot 7897421Sroot /* 7907421Sroot * If parent wants us to take the signal, 79143895Skarels * then it will leave it in p->p_xstat; 7927421Sroot * otherwise we just look for signals again. 7937421Sroot */ 79440807Smarc p->p_sig &= ~mask; /* clear the old signal */ 79543895Skarels sig = p->p_xstat; 7967421Sroot if (sig == 0) 7977421Sroot continue; 79814782Ssam 79914782Ssam /* 80040807Smarc * Put the new signal into p_sig. 80140807Smarc * If signal is being masked, 80240807Smarc * look for other signals. 80314782Ssam */ 80417153Sbloom mask = sigmask(sig); 80540807Smarc p->p_sig |= mask; 80640807Smarc if (p->p_sigmask & mask) 80714782Ssam continue; 8087421Sroot } 80940807Smarc 81040807Smarc /* 81140807Smarc * Decide whether the signal should be returned. 81240807Smarc * Return the signal's number, or fall through 81340807Smarc * to clear it from the pending mask. 81440807Smarc */ 81547540Skarels switch ((int)p->p_sigacts->ps_sigact[sig]) { 8167421Sroot 8177421Sroot case SIG_DFL: 8187421Sroot /* 8197421Sroot * Don't take default actions on system processes. 8207421Sroot */ 82147540Skarels if (p->p_pid <= 1) 82240807Smarc break; /* == ignore */ 82340807Smarc /* 82440807Smarc * If there is a pending stop signal to process 82540807Smarc * with default action, stop here, 82642437Skarels * then clear the signal. However, 82742437Skarels * if process is member of an orphaned 82842437Skarels * process group, ignore tty stop signals. 82940807Smarc */ 83047540Skarels if (prop & SA_STOP) { 83142437Skarels if (p->p_flag&STRC || 83242437Skarels (p->p_pgrp->pg_jobc == 0 && 83347540Skarels prop & SA_TTYSTOP)) 83440807Smarc break; /* == ignore */ 83543895Skarels p->p_xstat = sig; 8367421Sroot stop(p); 83739513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 83839513Skarels psignal(p->p_pptr, SIGCHLD); 8397421Sroot swtch(); 84040807Smarc break; 84147540Skarels } else if (prop & SA_IGNORE) { 8427421Sroot /* 84339513Skarels * Except for SIGCONT, shouldn't get here. 84439513Skarels * Default action is to ignore; drop it. 8457421Sroot */ 84640807Smarc break; /* == ignore */ 84739513Skarels } else 84840807Smarc return (sig); 8497421Sroot /*NOTREACHED*/ 8507421Sroot 8517421Sroot case SIG_IGN: 8527421Sroot /* 85339513Skarels * Masking above should prevent us ever trying 85439513Skarels * to take action on an ignored signal other 85539513Skarels * than SIGCONT, unless process is traced. 8567421Sroot */ 85747540Skarels if ((prop & SA_CONT) == 0 && (p->p_flag&STRC) == 0) 8587421Sroot printf("issig\n"); 85940807Smarc break; /* == ignore */ 8607421Sroot 8617421Sroot default: 8627421Sroot /* 8637421Sroot * This signal has an action, let 8647421Sroot * psig process it. 8657421Sroot */ 86640807Smarc return (sig); 8677421Sroot } 86840807Smarc p->p_sig &= ~mask; /* take the signal! */ 8697421Sroot } 87040807Smarc /* NOTREACHED */ 8717421Sroot } 8727421Sroot 8737421Sroot /* 8747421Sroot * Put the argument process into the stopped 87518331Skarels * state and notify the parent via wakeup. 87618331Skarels * Signals are handled elsewhere. 87740807Smarc * The process must not be on the run queue. 8787421Sroot */ 8797421Sroot stop(p) 8807421Sroot register struct proc *p; 8817421Sroot { 8827421Sroot 8837421Sroot p->p_stat = SSTOP; 8847421Sroot p->p_flag &= ~SWTED; 8857421Sroot wakeup((caddr_t)p->p_pptr); 8867421Sroot } 8877421Sroot 8887421Sroot /* 88947540Skarels * Take the action for the specified signal 89047540Skarels * from the current set of pending signals. 8917421Sroot */ 89247540Skarels void 89340807Smarc psig(sig) 89440807Smarc register int sig; 8957421Sroot { 89647540Skarels register struct proc *p = curproc; 89747540Skarels register struct sigacts *ps = p->p_sigacts; 89847540Skarels register sig_t action; 89939513Skarels int mask, returnmask; 9007421Sroot 90140807Smarc #ifdef DIAGNOSTIC 90247540Skarels if (sig == 0) 90347540Skarels panic("psig"); 90440807Smarc #endif 90547540Skarels mask = sigmask(sig); 90647540Skarels p->p_sig &= ~mask; 90747540Skarels action = ps->ps_sigact[sig]; 90840807Smarc #ifdef KTRACE 90947540Skarels if (KTRPOINT(p, KTR_PSIG)) 91047540Skarels ktrpsig(p->p_tracep, sig, action, ps->ps_flags & SA_OLDMASK ? 91147540Skarels ps->ps_oldmask : p->p_sigmask, 0); 91240807Smarc #endif 91347540Skarels if (action == SIG_DFL) { 91447540Skarels /* 91547540Skarels * Default action, where the default is to kill 91647540Skarels * the process. (Other cases were ignored above.) 91747540Skarels */ 91847650Skarels sigexit(p, sig); 91947540Skarels /* NOTREACHED */ 92047540Skarels } else { 92147540Skarels /* 92247540Skarels * If we get here, the signal must be caught. 92347540Skarels */ 92439513Skarels #ifdef DIAGNOSTIC 92547540Skarels if (action == SIG_IGN || (p->p_sigmask & mask)) 92647540Skarels panic("psig action"); 92739513Skarels #endif 92847540Skarels /* 92947540Skarels * Set the new mask value and also defer further 93047540Skarels * occurences of this signal. 93147540Skarels * 93247540Skarels * Special case: user has done a sigpause. Here the 93347540Skarels * current mask is not of interest, but rather the 93447540Skarels * mask from before the sigpause is what we want 93547540Skarels * restored after the signal processing is completed. 93647540Skarels */ 93747540Skarels (void) splhigh(); 93847540Skarels if (ps->ps_flags & SA_OLDMASK) { 93947540Skarels returnmask = ps->ps_oldmask; 94047540Skarels ps->ps_flags &= ~SA_OLDMASK; 94147540Skarels } else 94247540Skarels returnmask = p->p_sigmask; 94347540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 94447540Skarels (void) spl0(); 94547540Skarels p->p_stats->p_ru.ru_nsignals++; 94647540Skarels sendsig(action, sig, returnmask, 0); 94747540Skarels } 9487421Sroot } 9497421Sroot 9507421Sroot /* 95147650Skarels * Force the current process to exit with the specified 95247650Skarels * signal, dumping core if appropriate. We bypass the normal 95347650Skarels * tests for masked and caught signals, allowing unrecoverable 95447650Skarels * failures to terminate the process without changing signal state. 95547650Skarels * Mark the accounting record with the signal termination. 95647650Skarels * If dumping core, save the signal number for the debugger. 95747650Skarels * Calls exit and does not return. 95847650Skarels */ 95947650Skarels sigexit(p, sig) 96047650Skarels register struct proc *p; 96147650Skarels int sig; 96247650Skarels { 96347650Skarels 96447650Skarels p->p_acflag |= AXSIG; 96547650Skarels if (sigprop[sig] & SA_CORE) { 96647650Skarels p->p_sigacts->ps_sig = sig; 96747650Skarels if (coredump(p) == 0) 96847650Skarels sig |= WCOREFLAG; 96947650Skarels } 97047650Skarels exit(p, W_EXITCODE(0, sig)); 97147650Skarels /* NOTREACHED */ 97247650Skarels } 97347650Skarels 97447650Skarels /* 97547540Skarels * Create a core dump. 97647540Skarels * The file name should probably be "core.progname" 97747540Skarels * (or "mos.progname", or "dram.progname", or ...). 97847540Skarels * Core dumps aren't created if the process 9797421Sroot */ 98047540Skarels coredump(p) 98147540Skarels register struct proc *p; 9827421Sroot { 98337728Smckusick register struct vnode *vp; 98447540Skarels register struct pcred *pcred = p->p_cred; 98547540Skarels register struct ucred *cred = pcred->pc_ucred; 98647540Skarels register struct vmspace *vm = p->p_vmspace; 98737580Smckusick struct vattr vattr; 98837580Smckusick int error; 98947540Skarels struct nameidata nd; 9907421Sroot 99147540Skarels if (pcred->p_svuid != pcred->p_ruid || 99247540Skarels pcred->p_svgid != pcred->p_rgid) 99337580Smckusick return (EFAULT); 99447540Skarels if (ctob(UPAGES + vm->vm_dsize + vm->vm_ssize) >= 99547540Skarels p->p_rlimit[RLIMIT_CORE].rlim_cur) 99637580Smckusick return (EFAULT); 99747540Skarels nd.ni_segflg = UIO_SYSSPACE; 99847540Skarels nd.ni_dirp = "core"; 99947540Skarels if (error = vn_open(&nd, p, FCREAT|FWRITE, 0644)) 100037580Smckusick return (error); 100147540Skarels vp = nd.ni_vp; 100238394Smckusick VOP_LOCK(vp); 1003*48020Smckusick if (vp->v_type != VREG || VOP_GETATTR(vp, &vattr, cred, p) || 100437580Smckusick vattr.va_nlink != 1) { 100538394Smckusick vput(vp); 100638394Smckusick return (EFAULT); 10077818Sroot } 100841362Smckusick VATTR_NULL(&vattr); 100937580Smckusick vattr.va_size = 0; 1010*48020Smckusick VOP_SETATTR(vp, &vattr, cred, p); 101147540Skarels p->p_acflag |= ACORE; 101247650Skarels bcopy(p, &u.u_kproc.kp_proc, sizeof(struct proc)); 101347650Skarels fill_eproc(p, &u.u_kproc.kp_eproc); 101442004Smckusick #ifdef HPUXCOMPAT 101542004Smckusick /* 101642004Smckusick * BLETCH! If we loaded from an HPUX format binary file 101742004Smckusick * we have to dump an HPUX style user struct so that the 101842004Smckusick * HPUX debuggers can grok it. 101942004Smckusick */ 102042004Smckusick if (u.u_pcb.pcb_flags & PCB_HPUXBIN) 102147540Skarels error = hpuxdumpu(vp, cred); 102242004Smckusick else 102342004Smckusick #endif 1024*48020Smckusick error = vn_rdwr(UIO_WRITE, vp, (caddr_t)&p->p_addr, ctob(UPAGES), 1025*48020Smckusick (off_t)0, UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, cred, (int *)0, 1026*48020Smckusick (struct proc *)0); 102737580Smckusick if (error == 0) 102847540Skarels error = vn_rdwr(UIO_WRITE, vp, vm->vm_daddr, 102947540Skarels (int)ctob(vm->vm_dsize), (off_t)ctob(UPAGES), UIO_USERSPACE, 1030*48020Smckusick IO_NODELOCKED|IO_UNIT, cred, (int *)0, p); 103137580Smckusick if (error == 0) 103237580Smckusick error = vn_rdwr(UIO_WRITE, vp, 103347540Skarels trunc_page(USRSTACK - ctob(vm->vm_ssize)), 103447540Skarels round_page(ctob(vm->vm_ssize)), 103547540Skarels (off_t)ctob(UPAGES) + ctob(vm->vm_dsize), UIO_USERSPACE, 1036*48020Smckusick IO_NODELOCKED|IO_UNIT, cred, (int *)0, p); 103738394Smckusick vput(vp); 103837580Smckusick return (error); 10397421Sroot } 104039513Skarels 104139513Skarels /* 104239513Skarels * Nonexistent system call-- signal process (may want to handle it). 104339513Skarels * Flag error in case process won't see signal immediately (blocked or ignored). 104439513Skarels */ 104543364Smckusick /* ARGSUSED */ 104643364Smckusick nosys(p, args, retval) 104743364Smckusick struct proc *p; 104843364Smckusick void *args; 104943364Smckusick int *retval; 105039513Skarels { 105139513Skarels 105243364Smckusick psignal(p, SIGSYS); 105344405Skarels return (EINVAL); 105439513Skarels } 1055