|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986, 1989, 1991 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms, with or without ! 6: * modification, are permitted provided that the following conditions ! 7: * are met: ! 8: * 1. Redistributions of source code must retain the above copyright ! 9: * notice, this list of conditions and the following disclaimer. ! 10: * 2. Redistributions in binary form must reproduce the above copyright ! 11: * notice, this list of conditions and the following disclaimer in the ! 12: * documentation and/or other materials provided with the distribution. ! 13: * 3. All advertising materials mentioning features or use of this software ! 14: * must display the following acknowledgement: ! 15: * This product includes software developed by the University of ! 16: * California, Berkeley and its contributors. ! 17: * 4. Neither the name of the University nor the names of its contributors ! 18: * may be used to endorse or promote products derived from this software ! 19: * without specific prior written permission. ! 20: * ! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 31: * SUCH DAMAGE. ! 32: * ! 33: * @(#)kern_sig.c 7.35 (Berkeley) 6/28/91 ! 34: */ ! 35: ! 36: #define SIGPROP /* include signal properties table */ ! 37: #include "param.h" ! 38: #include "signalvar.h" ! 39: #include "resourcevar.h" ! 40: #include "namei.h" ! 41: #include "vnode.h" ! 42: #include "proc.h" ! 43: #include "systm.h" ! 44: #include "timeb.h" ! 45: #include "times.h" ! 46: #include "buf.h" ! 47: #include "seg.h" ! 48: #include "acct.h" ! 49: #include "file.h" ! 50: #include "kernel.h" ! 51: #include "wait.h" ! 52: #include "ktrace.h" ! 53: ! 54: #include "machine/cpu.h" ! 55: ! 56: #include "vm/vm.h" ! 57: #include "kinfo_proc.h" ! 58: #include "user.h" /* for coredump */ ! 59: ! 60: /* ! 61: * Can process p, with pcred pc, send the signal signo to process q? ! 62: */ ! 63: #define CANSIGNAL(p, pc, q, signo) \ ! 64: ((pc)->pc_ucred->cr_uid == 0 || \ ! 65: (pc)->p_ruid == (q)->p_cred->p_ruid || \ ! 66: (pc)->pc_ucred->cr_uid == (q)->p_cred->p_ruid || \ ! 67: (pc)->p_ruid == (q)->p_ucred->cr_uid || \ ! 68: (pc)->pc_ucred->cr_uid == (q)->p_ucred->cr_uid || \ ! 69: ((signo) == SIGCONT && (q)->p_session == (p)->p_session)) ! 70: ! 71: /* ARGSUSED */ ! 72: sigaction(p, uap, retval) ! 73: struct proc *p; ! 74: register struct args { ! 75: int signo; ! 76: struct sigaction *nsa; ! 77: struct sigaction *osa; ! 78: } *uap; ! 79: int *retval; ! 80: { ! 81: struct sigaction vec; ! 82: register struct sigaction *sa; ! 83: register struct sigacts *ps = p->p_sigacts; ! 84: register int sig; ! 85: int bit, error; ! 86: ! 87: sig = uap->signo; ! 88: if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) ! 89: return (EINVAL); ! 90: sa = &vec; ! 91: if (uap->osa) { ! 92: sa->sa_handler = ps->ps_sigact[sig]; ! 93: sa->sa_mask = ps->ps_catchmask[sig]; ! 94: bit = sigmask(sig); ! 95: sa->sa_flags = 0; ! 96: if ((ps->ps_sigonstack & bit) != 0) ! 97: sa->sa_flags |= SA_ONSTACK; ! 98: if ((ps->ps_sigintr & bit) == 0) ! 99: sa->sa_flags |= SA_RESTART; ! 100: if (p->p_flag & SNOCLDSTOP) ! 101: sa->sa_flags |= SA_NOCLDSTOP; ! 102: if (error = copyout((caddr_t)sa, (caddr_t)uap->osa, ! 103: sizeof (vec))) ! 104: return (error); ! 105: } ! 106: if (uap->nsa) { ! 107: if (error = copyin((caddr_t)uap->nsa, (caddr_t)sa, ! 108: sizeof (vec))) ! 109: return (error); ! 110: setsigvec(p, sig, sa); ! 111: } ! 112: return (0); ! 113: } ! 114: ! 115: setsigvec(p, sig, sa) ! 116: register struct proc *p; ! 117: int sig; ! 118: register struct sigaction *sa; ! 119: { ! 120: register struct sigacts *ps = p->p_sigacts; ! 121: register int bit; ! 122: ! 123: bit = sigmask(sig); ! 124: /* ! 125: * Change setting atomically. ! 126: */ ! 127: (void) splhigh(); ! 128: ps->ps_sigact[sig] = sa->sa_handler; ! 129: ps->ps_catchmask[sig] = sa->sa_mask &~ sigcantmask; ! 130: if ((sa->sa_flags & SA_RESTART) == 0) ! 131: ps->ps_sigintr |= bit; ! 132: else ! 133: ps->ps_sigintr &= ~bit; ! 134: if (sa->sa_flags & SA_ONSTACK) ! 135: ps->ps_sigonstack |= bit; ! 136: else ! 137: ps->ps_sigonstack &= ~bit; ! 138: if (sig == SIGCHLD) { ! 139: if (sa->sa_flags & SA_NOCLDSTOP) ! 140: p->p_flag |= SNOCLDSTOP; ! 141: else ! 142: p->p_flag &= ~SNOCLDSTOP; ! 143: } ! 144: /* ! 145: * Set bit in p_sigignore for signals that are set to SIG_IGN, ! 146: * and for signals set to SIG_DFL where the default is to ignore. ! 147: * However, don't put SIGCONT in p_sigignore, ! 148: * as we have to restart the process. ! 149: */ ! 150: if (sa->sa_handler == SIG_IGN || ! 151: (sigprop[sig] & SA_IGNORE && sa->sa_handler == SIG_DFL)) { ! 152: p->p_sig &= ~bit; /* never to be seen again */ ! 153: if (sig != SIGCONT) ! 154: p->p_sigignore |= bit; /* easier in psignal */ ! 155: p->p_sigcatch &= ~bit; ! 156: } else { ! 157: p->p_sigignore &= ~bit; ! 158: if (sa->sa_handler == SIG_DFL) ! 159: p->p_sigcatch &= ~bit; ! 160: else ! 161: p->p_sigcatch |= bit; ! 162: } ! 163: (void) spl0(); ! 164: } ! 165: ! 166: /* ! 167: * Initialize signal state for process 0; ! 168: * set to ignore signals that are ignored by default. ! 169: */ ! 170: void ! 171: siginit(p) ! 172: struct proc *p; ! 173: { ! 174: register int i; ! 175: ! 176: for (i = 0; i < NSIG; i++) ! 177: if (sigprop[i] & SA_IGNORE && i != SIGCONT) ! 178: p->p_sigignore |= sigmask(i); ! 179: } ! 180: ! 181: /* ! 182: * Reset signals for an exec of the specified process. ! 183: */ ! 184: void ! 185: execsigs(p) ! 186: register struct proc *p; ! 187: { ! 188: register struct sigacts *ps = p->p_sigacts; ! 189: register int nc, mask; ! 190: ! 191: /* ! 192: * Reset caught signals. Held signals remain held ! 193: * through p_sigmask (unless they were caught, ! 194: * and are now ignored by default). ! 195: */ ! 196: while (p->p_sigcatch) { ! 197: nc = ffs((long)p->p_sigcatch); ! 198: mask = sigmask(nc); ! 199: p->p_sigcatch &= ~mask; ! 200: if (sigprop[nc] & SA_IGNORE) { ! 201: if (nc != SIGCONT) ! 202: p->p_sigignore |= mask; ! 203: p->p_sig &= ~mask; ! 204: } ! 205: ps->ps_sigact[nc] = SIG_DFL; ! 206: } ! 207: /* ! 208: * Reset stack state to the user stack. ! 209: * Clear set of signals caught on the signal stack. ! 210: */ ! 211: ps->ps_onstack = 0; ! 212: ps->ps_sigsp = 0; ! 213: ps->ps_sigonstack = 0; ! 214: } ! 215: ! 216: /* ! 217: * Manipulate signal mask. ! 218: * Note that we receive new mask, not pointer, ! 219: * and return old mask as return value; ! 220: * the library stub does the rest. ! 221: */ ! 222: sigprocmask(p, uap, retval) ! 223: register struct proc *p; ! 224: struct args { ! 225: int how; ! 226: sigset_t mask; ! 227: } *uap; ! 228: int *retval; ! 229: { ! 230: int error = 0; ! 231: ! 232: *retval = p->p_sigmask; ! 233: (void) splhigh(); ! 234: ! 235: switch (uap->how) { ! 236: case SIG_BLOCK: ! 237: p->p_sigmask |= uap->mask &~ sigcantmask; ! 238: break; ! 239: ! 240: case SIG_UNBLOCK: ! 241: p->p_sigmask &= ~uap->mask; ! 242: break; ! 243: ! 244: case SIG_SETMASK: ! 245: p->p_sigmask = uap->mask &~ sigcantmask; ! 246: break; ! 247: ! 248: default: ! 249: error = EINVAL; ! 250: break; ! 251: } ! 252: (void) spl0(); ! 253: return (error); ! 254: } ! 255: ! 256: /* ARGSUSED */ ! 257: sigpending(p, uap, retval) ! 258: struct proc *p; ! 259: void *uap; ! 260: int *retval; ! 261: { ! 262: ! 263: *retval = p->p_sig; ! 264: return (0); ! 265: } ! 266: ! 267: #ifdef COMPAT_43 ! 268: /* ! 269: * Generalized interface signal handler, 4.3-compatible. ! 270: */ ! 271: /* ARGSUSED */ ! 272: osigvec(p, uap, retval) ! 273: struct proc *p; ! 274: register struct args { ! 275: int signo; ! 276: struct sigvec *nsv; ! 277: struct sigvec *osv; ! 278: } *uap; ! 279: int *retval; ! 280: { ! 281: struct sigvec vec; ! 282: register struct sigacts *ps = p->p_sigacts; ! 283: register struct sigvec *sv; ! 284: register int sig; ! 285: int bit, error; ! 286: ! 287: sig = uap->signo; ! 288: if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) ! 289: return (EINVAL); ! 290: sv = &vec; ! 291: if (uap->osv) { ! 292: *(sig_t *)&sv->sv_handler = ps->ps_sigact[sig]; ! 293: sv->sv_mask = ps->ps_catchmask[sig]; ! 294: bit = sigmask(sig); ! 295: sv->sv_flags = 0; ! 296: if ((ps->ps_sigonstack & bit) != 0) ! 297: sv->sv_flags |= SV_ONSTACK; ! 298: if ((ps->ps_sigintr & bit) != 0) ! 299: sv->sv_flags |= SV_INTERRUPT; ! 300: if (p->p_flag & SNOCLDSTOP) ! 301: sv->sv_flags |= SA_NOCLDSTOP; ! 302: if (error = copyout((caddr_t)sv, (caddr_t)uap->osv, ! 303: sizeof (vec))) ! 304: return (error); ! 305: } ! 306: if (uap->nsv) { ! 307: if (error = copyin((caddr_t)uap->nsv, (caddr_t)sv, ! 308: sizeof (vec))) ! 309: return (error); ! 310: sv->sv_flags ^= SA_RESTART; /* opposite of SV_INTERRUPT */ ! 311: setsigvec(p, sig, (struct sigaction *)sv); ! 312: } ! 313: return (0); ! 314: } ! 315: ! 316: osigblock(p, uap, retval) ! 317: register struct proc *p; ! 318: struct args { ! 319: int mask; ! 320: } *uap; ! 321: int *retval; ! 322: { ! 323: ! 324: (void) splhigh(); ! 325: *retval = p->p_sigmask; ! 326: p->p_sigmask |= uap->mask &~ sigcantmask; ! 327: (void) spl0(); ! 328: return (0); ! 329: } ! 330: ! 331: osigsetmask(p, uap, retval) ! 332: struct proc *p; ! 333: struct args { ! 334: int mask; ! 335: } *uap; ! 336: int *retval; ! 337: { ! 338: ! 339: (void) splhigh(); ! 340: *retval = p->p_sigmask; ! 341: p->p_sigmask = uap->mask &~ sigcantmask; ! 342: (void) spl0(); ! 343: return (0); ! 344: } ! 345: #endif ! 346: ! 347: /* ! 348: * Suspend process until signal, providing mask to be set ! 349: * in the meantime. Note nonstandard calling convention: ! 350: * libc stub passes mask, not pointer, to save a copyin. ! 351: */ ! 352: /* ARGSUSED */ ! 353: sigsuspend(p, uap, retval) ! 354: register struct proc *p; ! 355: struct args { ! 356: sigset_t mask; ! 357: } *uap; ! 358: int *retval; ! 359: { ! 360: register struct sigacts *ps = p->p_sigacts; ! 361: ! 362: /* ! 363: * When returning from sigpause, we want ! 364: * the old mask to be restored after the ! 365: * signal handler has finished. Thus, we ! 366: * save it here and mark the proc structure ! 367: * to indicate this (should be in sigacts). ! 368: */ ! 369: ps->ps_oldmask = p->p_sigmask; ! 370: ps->ps_flags |= SA_OLDMASK; ! 371: p->p_sigmask = uap->mask &~ sigcantmask; ! 372: (void) tsleep((caddr_t) ps, PPAUSE|PCATCH, "pause", 0); ! 373: /* always return EINTR rather than ERESTART... */ ! 374: return (EINTR); ! 375: } ! 376: ! 377: /* ARGSUSED */ ! 378: sigstack(p, uap, retval) ! 379: struct proc *p; ! 380: register struct args { ! 381: struct sigstack *nss; ! 382: struct sigstack *oss; ! 383: } *uap; ! 384: int *retval; ! 385: { ! 386: struct sigstack ss; ! 387: int error = 0; ! 388: ! 389: if (uap->oss && (error = copyout((caddr_t)&p->p_sigacts->ps_sigstack, ! 390: (caddr_t)uap->oss, sizeof (struct sigstack)))) ! 391: return (error); ! 392: if (uap->nss && (error = copyin((caddr_t)uap->nss, (caddr_t)&ss, ! 393: sizeof (ss))) == 0) ! 394: p->p_sigacts->ps_sigstack = ss; ! 395: return (error); ! 396: } ! 397: ! 398: /* ARGSUSED */ ! 399: kill(cp, uap, retval) ! 400: register struct proc *cp; ! 401: register struct args { ! 402: int pid; ! 403: int signo; ! 404: } *uap; ! 405: int *retval; ! 406: { ! 407: register struct proc *p; ! 408: register struct pcred *pc = cp->p_cred; ! 409: ! 410: if ((unsigned) uap->signo >= NSIG) ! 411: return (EINVAL); ! 412: if (uap->pid > 0) { ! 413: /* kill single process */ ! 414: p = pfind(uap->pid); ! 415: if (p == 0) ! 416: return (ESRCH); ! 417: if (!CANSIGNAL(cp, pc, p, uap->signo)) ! 418: return (EPERM); ! 419: if (uap->signo) ! 420: psignal(p, uap->signo); ! 421: return (0); ! 422: } ! 423: switch (uap->pid) { ! 424: case -1: /* broadcast signal */ ! 425: return (killpg1(cp, uap->signo, 0, 1)); ! 426: case 0: /* signal own process group */ ! 427: return (killpg1(cp, uap->signo, 0, 0)); ! 428: default: /* negative explicit process group */ ! 429: return (killpg1(cp, uap->signo, -uap->pid, 0)); ! 430: } ! 431: /* NOTREACHED */ ! 432: } ! 433: ! 434: #ifdef COMPAT_43 ! 435: /* ARGSUSED */ ! 436: okillpg(p, uap, retval) ! 437: struct proc *p; ! 438: register struct args { ! 439: int pgid; ! 440: int signo; ! 441: } *uap; ! 442: int *retval; ! 443: { ! 444: ! 445: if ((unsigned) uap->signo >= NSIG) ! 446: return (EINVAL); ! 447: return (killpg1(p, uap->signo, uap->pgid, 0)); ! 448: } ! 449: #endif ! 450: ! 451: /* ! 452: * Common code for kill process group/broadcast kill. ! 453: * cp is calling process. ! 454: */ ! 455: killpg1(cp, signo, pgid, all) ! 456: register struct proc *cp; ! 457: int signo, pgid, all; ! 458: { ! 459: register struct proc *p; ! 460: register struct pcred *pc = cp->p_cred; ! 461: struct pgrp *pgrp; ! 462: int nfound = 0; ! 463: ! 464: if (all) ! 465: /* ! 466: * broadcast ! 467: */ ! 468: for (p = allproc; p != NULL; p = p->p_nxt) { ! 469: if (p->p_pid <= 1 || p->p_flag&SSYS || ! 470: p == cp || !CANSIGNAL(cp, pc, p, signo)) ! 471: continue; ! 472: nfound++; ! 473: if (signo) ! 474: psignal(p, signo); ! 475: } ! 476: else { ! 477: if (pgid == 0) ! 478: /* ! 479: * zero pgid means send to my process group. ! 480: */ ! 481: pgrp = cp->p_pgrp; ! 482: else { ! 483: pgrp = pgfind(pgid); ! 484: if (pgrp == NULL) ! 485: return (ESRCH); ! 486: } ! 487: for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) { ! 488: if (p->p_pid <= 1 || p->p_flag&SSYS || ! 489: p->p_stat == SZOMB || !CANSIGNAL(cp, pc, p, signo)) ! 490: continue; ! 491: nfound++; ! 492: if (signo) ! 493: psignal(p, signo); ! 494: } ! 495: } ! 496: return (nfound ? 0 : ESRCH); ! 497: } ! 498: ! 499: /* ! 500: * Send the specified signal to ! 501: * all processes with 'pgid' as ! 502: * process group. ! 503: */ ! 504: void ! 505: gsignal(pgid, sig) ! 506: int pgid, sig; ! 507: { ! 508: struct pgrp *pgrp; ! 509: ! 510: if (pgid && (pgrp = pgfind(pgid))) ! 511: pgsignal(pgrp, sig, 0); ! 512: } ! 513: ! 514: /* ! 515: * Send sig to every member of a process group. ! 516: * If checktty is 1, limit to members which have a controlling ! 517: * terminal. ! 518: */ ! 519: void ! 520: pgsignal(pgrp, sig, checkctty) ! 521: struct pgrp *pgrp; ! 522: int sig, checkctty; ! 523: { ! 524: register struct proc *p; ! 525: ! 526: if (pgrp) ! 527: for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) ! 528: if (checkctty == 0 || p->p_flag&SCTTY) ! 529: psignal(p, sig); ! 530: } ! 531: ! 532: /* ! 533: * Send a signal caused by a trap to the current process. ! 534: * If it will be caught immediately, deliver it with correct code. ! 535: * Otherwise, post it normally. ! 536: */ ! 537: void ! 538: trapsignal(p, sig, code) ! 539: struct proc *p; ! 540: register int sig; ! 541: unsigned code; ! 542: { ! 543: register struct sigacts *ps = p->p_sigacts; ! 544: int mask; ! 545: ! 546: mask = sigmask(sig); ! 547: if ((p->p_flag & STRC) == 0 && (p->p_sigcatch & mask) != 0 && ! 548: (p->p_sigmask & mask) == 0) { ! 549: p->p_stats->p_ru.ru_nsignals++; ! 550: #ifdef KTRACE ! 551: if (KTRPOINT(p, KTR_PSIG)) ! 552: ktrpsig(p->p_tracep, sig, ps->ps_sigact[sig], ! 553: p->p_sigmask, code); ! 554: #endif ! 555: sendsig(ps->ps_sigact[sig], sig, p->p_sigmask, code); ! 556: p->p_sigmask |= ps->ps_catchmask[sig] | mask; ! 557: } else { ! 558: ps->ps_code = code; /* XXX for core dump/debugger */ ! 559: psignal(p, sig); ! 560: } ! 561: } ! 562: ! 563: /* ! 564: * Send the specified signal to the specified process. ! 565: * If the signal has an action, the action is usually performed ! 566: * by the target process rather than the caller; we simply add ! 567: * the signal to the set of pending signals for the process. ! 568: * Exceptions: ! 569: * o When a stop signal is sent to a sleeping process that takes the default ! 570: * action, the process is stopped without awakening it. ! 571: * o SIGCONT restarts stopped processes (or puts them back to sleep) ! 572: * regardless of the signal action (eg, blocked or ignored). ! 573: * Other ignored signals are discarded immediately. ! 574: */ ! 575: void ! 576: psignal(p, sig) ! 577: register struct proc *p; ! 578: register int sig; ! 579: { ! 580: register int s, prop; ! 581: register sig_t action; ! 582: int mask; ! 583: ! 584: if ((unsigned)sig >= NSIG || sig == 0) ! 585: panic("psignal sig"); ! 586: mask = sigmask(sig); ! 587: prop = sigprop[sig]; ! 588: ! 589: /* ! 590: * If proc is traced, always give parent a chance. ! 591: */ ! 592: if (p->p_flag & STRC) ! 593: action = SIG_DFL; ! 594: else { ! 595: /* ! 596: * If the signal is being ignored, ! 597: * then we forget about it immediately. ! 598: * (Note: we don't set SIGCONT in p_sigignore, ! 599: * and if it is set to SIG_IGN, ! 600: * action will be SIG_DFL here.) ! 601: */ ! 602: if (p->p_sigignore & mask) ! 603: return; ! 604: if (p->p_sigmask & mask) ! 605: action = SIG_HOLD; ! 606: else if (p->p_sigcatch & mask) ! 607: action = SIG_CATCH; ! 608: else ! 609: action = SIG_DFL; ! 610: } ! 611: ! 612: if (p->p_nice > NZERO && (sig == SIGKILL || ! 613: sig == SIGTERM && (p->p_flag&STRC || action != SIG_DFL))) ! 614: p->p_nice = NZERO; ! 615: ! 616: if (prop & SA_CONT) ! 617: p->p_sig &= ~stopsigmask; ! 618: ! 619: if (prop & SA_STOP) { ! 620: /* ! 621: * If sending a tty stop signal to a member of an orphaned ! 622: * process group, discard the signal here if the action ! 623: * is default; don't stop the process below if sleeping, ! 624: * and don't clear any pending SIGCONT. ! 625: */ ! 626: if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0 && ! 627: action == SIG_DFL) ! 628: return; ! 629: p->p_sig &= ~contsigmask; ! 630: } ! 631: p->p_sig |= mask; ! 632: ! 633: /* ! 634: * Defer further processing for signals which are held, ! 635: * except that stopped processes must be continued by SIGCONT. ! 636: */ ! 637: if (action == SIG_HOLD && ((prop & SA_CONT) == 0 || p->p_stat != SSTOP)) ! 638: return; ! 639: s = splhigh(); ! 640: switch (p->p_stat) { ! 641: ! 642: case SSLEEP: ! 643: /* ! 644: * If process is sleeping uninterruptibly ! 645: * we can't interrupt the sleep... the signal will ! 646: * be noticed when the process returns through ! 647: * trap() or syscall(). ! 648: */ ! 649: if ((p->p_flag & SSINTR) == 0) ! 650: goto out; ! 651: /* ! 652: * Process is sleeping and traced... make it runnable ! 653: * so it can discover the signal in issig() and stop ! 654: * for the parent. ! 655: */ ! 656: if (p->p_flag&STRC) ! 657: goto run; ! 658: /* ! 659: * When a sleeping process receives a stop ! 660: * signal, process immediately if possible. ! 661: * All other (caught or default) signals ! 662: * cause the process to run. ! 663: */ ! 664: if (prop & SA_STOP) { ! 665: if (action != SIG_DFL) ! 666: goto runfast; ! 667: /* ! 668: * If a child holding parent blocked, ! 669: * stopping could cause deadlock. ! 670: */ ! 671: if (p->p_flag&SPPWAIT) ! 672: goto out; ! 673: p->p_sig &= ~mask; ! 674: p->p_xstat = sig; ! 675: if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) ! 676: psignal(p->p_pptr, SIGCHLD); ! 677: stop(p); ! 678: goto out; ! 679: } else ! 680: goto runfast; ! 681: /*NOTREACHED*/ ! 682: ! 683: case SSTOP: ! 684: /* ! 685: * If traced process is already stopped, ! 686: * then no further action is necessary. ! 687: */ ! 688: if (p->p_flag&STRC) ! 689: goto out; ! 690: ! 691: /* ! 692: * Kill signal always sets processes running. ! 693: */ ! 694: if (sig == SIGKILL) ! 695: goto runfast; ! 696: ! 697: if (prop & SA_CONT) { ! 698: /* ! 699: * If SIGCONT is default (or ignored), we continue ! 700: * the process but don't leave the signal in p_sig, ! 701: * as it has no further action. If SIGCONT is held, ! 702: * continue the process and leave the signal in p_sig. ! 703: * If the process catches SIGCONT, let it handle ! 704: * the signal itself. If it isn't waiting on ! 705: * an event, then it goes back to run state. ! 706: * Otherwise, process goes back to sleep state. ! 707: */ ! 708: if (action == SIG_DFL) ! 709: p->p_sig &= ~mask; ! 710: if (action == SIG_CATCH) ! 711: goto runfast; ! 712: if (p->p_wchan == 0) ! 713: goto run; ! 714: p->p_stat = SSLEEP; ! 715: goto out; ! 716: } ! 717: ! 718: if (prop & SA_STOP) { ! 719: /* ! 720: * Already stopped, don't need to stop again. ! 721: * (If we did the shell could get confused.) ! 722: */ ! 723: p->p_sig &= ~mask; /* take it away */ ! 724: goto out; ! 725: } ! 726: ! 727: /* ! 728: * If process is sleeping interruptibly, then ! 729: * simulate a wakeup so that when it is continued, ! 730: * it will be made runnable and can look at the signal. ! 731: * But don't setrun the process, leave it stopped. ! 732: */ ! 733: if (p->p_wchan && p->p_flag & SSINTR) ! 734: unsleep(p); ! 735: goto out; ! 736: ! 737: default: ! 738: /* ! 739: * SRUN, SIDL, SZOMB do nothing with the signal, ! 740: * other than kicking ourselves if we are running. ! 741: * It will either never be noticed, or noticed very soon. ! 742: */ ! 743: if (p == curproc) ! 744: signotify(p); ! 745: goto out; ! 746: } ! 747: /*NOTREACHED*/ ! 748: ! 749: runfast: ! 750: /* ! 751: * Raise priority to at least PUSER. ! 752: */ ! 753: if (p->p_pri > PUSER) ! 754: p->p_pri = PUSER; ! 755: run: ! 756: setrun(p); ! 757: out: ! 758: splx(s); ! 759: } ! 760: ! 761: /* ! 762: * If the current process has a signal to process (should be caught ! 763: * or cause termination, should interrupt current syscall), ! 764: * return the signal number. Stop signals with default action ! 765: * are processed immediately, then cleared; they aren't returned. ! 766: * This is checked after each entry to the system for a syscall ! 767: * or trap (though this can usually be done without actually calling ! 768: * issig by checking the pending signal masks in the CURSIG macro.) ! 769: * The normal call sequence is ! 770: * ! 771: * while (sig = CURSIG(curproc)) ! 772: * psig(sig); ! 773: */ ! 774: issig(p) ! 775: register struct proc *p; ! 776: { ! 777: register int sig, mask, prop; ! 778: ! 779: for (;;) { ! 780: mask = p->p_sig &~ p->p_sigmask; ! 781: if (p->p_flag&SPPWAIT) ! 782: mask &= ~stopsigmask; ! 783: if (mask == 0) /* no signal to send */ ! 784: return (0); ! 785: sig = ffs((long)mask); ! 786: mask = sigmask(sig); ! 787: prop = sigprop[sig]; ! 788: /* ! 789: * We should see pending but ignored signals ! 790: * only if STRC was on when they were posted. ! 791: */ ! 792: if (mask & p->p_sigignore && (p->p_flag&STRC) == 0) { ! 793: p->p_sig &= ~mask; ! 794: continue; ! 795: } ! 796: if (p->p_flag&STRC && (p->p_flag&SPPWAIT) == 0) { ! 797: /* ! 798: * If traced, always stop, and stay ! 799: * stopped until released by the parent. ! 800: */ ! 801: p->p_xstat = sig; ! 802: psignal(p->p_pptr, SIGCHLD); ! 803: do { ! 804: stop(p); ! 805: swtch(); ! 806: } while (!procxmt(p) && p->p_flag&STRC); ! 807: ! 808: /* ! 809: * If the traced bit got turned off, ! 810: * go back up to the top to rescan signals. ! 811: * This ensures that p_sig* and ps_sigact ! 812: * are consistent. ! 813: */ ! 814: if ((p->p_flag&STRC) == 0) ! 815: continue; ! 816: ! 817: /* ! 818: * If parent wants us to take the signal, ! 819: * then it will leave it in p->p_xstat; ! 820: * otherwise we just look for signals again. ! 821: */ ! 822: p->p_sig &= ~mask; /* clear the old signal */ ! 823: sig = p->p_xstat; ! 824: if (sig == 0) ! 825: continue; ! 826: ! 827: /* ! 828: * Put the new signal into p_sig. ! 829: * If signal is being masked, ! 830: * look for other signals. ! 831: */ ! 832: mask = sigmask(sig); ! 833: p->p_sig |= mask; ! 834: if (p->p_sigmask & mask) ! 835: continue; ! 836: } ! 837: ! 838: /* ! 839: * Decide whether the signal should be returned. ! 840: * Return the signal's number, or fall through ! 841: * to clear it from the pending mask. ! 842: */ ! 843: switch ((int)p->p_sigacts->ps_sigact[sig]) { ! 844: ! 845: case SIG_DFL: ! 846: /* ! 847: * Don't take default actions on system processes. ! 848: */ ! 849: if (p->p_pid <= 1) ! 850: break; /* == ignore */ ! 851: /* ! 852: * If there is a pending stop signal to process ! 853: * with default action, stop here, ! 854: * then clear the signal. However, ! 855: * if process is member of an orphaned ! 856: * process group, ignore tty stop signals. ! 857: */ ! 858: if (prop & SA_STOP) { ! 859: if (p->p_flag&STRC || ! 860: (p->p_pgrp->pg_jobc == 0 && ! 861: prop & SA_TTYSTOP)) ! 862: break; /* == ignore */ ! 863: p->p_xstat = sig; ! 864: stop(p); ! 865: if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) ! 866: psignal(p->p_pptr, SIGCHLD); ! 867: swtch(); ! 868: break; ! 869: } else if (prop & SA_IGNORE) { ! 870: /* ! 871: * Except for SIGCONT, shouldn't get here. ! 872: * Default action is to ignore; drop it. ! 873: */ ! 874: break; /* == ignore */ ! 875: } else ! 876: return (sig); ! 877: /*NOTREACHED*/ ! 878: ! 879: case SIG_IGN: ! 880: /* ! 881: * Masking above should prevent us ever trying ! 882: * to take action on an ignored signal other ! 883: * than SIGCONT, unless process is traced. ! 884: */ ! 885: if ((prop & SA_CONT) == 0 && (p->p_flag&STRC) == 0) ! 886: printf("issig\n"); ! 887: break; /* == ignore */ ! 888: ! 889: default: ! 890: /* ! 891: * This signal has an action, let ! 892: * psig process it. ! 893: */ ! 894: return (sig); ! 895: } ! 896: p->p_sig &= ~mask; /* take the signal! */ ! 897: } ! 898: /* NOTREACHED */ ! 899: } ! 900: ! 901: /* ! 902: * Put the argument process into the stopped ! 903: * state and notify the parent via wakeup. ! 904: * Signals are handled elsewhere. ! 905: * The process must not be on the run queue. ! 906: */ ! 907: stop(p) ! 908: register struct proc *p; ! 909: { ! 910: ! 911: p->p_stat = SSTOP; ! 912: p->p_flag &= ~SWTED; ! 913: wakeup((caddr_t)p->p_pptr); ! 914: } ! 915: ! 916: /* ! 917: * Take the action for the specified signal ! 918: * from the current set of pending signals. ! 919: */ ! 920: void ! 921: psig(sig) ! 922: register int sig; ! 923: { ! 924: register struct proc *p = curproc; ! 925: register struct sigacts *ps = p->p_sigacts; ! 926: register sig_t action; ! 927: int mask, returnmask; ! 928: ! 929: #ifdef DIAGNOSTIC ! 930: if (sig == 0) ! 931: panic("psig"); ! 932: #endif ! 933: mask = sigmask(sig); ! 934: p->p_sig &= ~mask; ! 935: action = ps->ps_sigact[sig]; ! 936: #ifdef KTRACE ! 937: if (KTRPOINT(p, KTR_PSIG)) ! 938: ktrpsig(p->p_tracep, sig, action, ps->ps_flags & SA_OLDMASK ? ! 939: ps->ps_oldmask : p->p_sigmask, 0); ! 940: #endif ! 941: if (action == SIG_DFL) { ! 942: /* ! 943: * Default action, where the default is to kill ! 944: * the process. (Other cases were ignored above.) ! 945: */ ! 946: sigexit(p, sig); ! 947: /* NOTREACHED */ ! 948: } else { ! 949: /* ! 950: * If we get here, the signal must be caught. ! 951: */ ! 952: #ifdef DIAGNOSTIC ! 953: if (action == SIG_IGN || (p->p_sigmask & mask)) ! 954: panic("psig action"); ! 955: #endif ! 956: /* ! 957: * Set the new mask value and also defer further ! 958: * occurences of this signal. ! 959: * ! 960: * Special case: user has done a sigpause. Here the ! 961: * current mask is not of interest, but rather the ! 962: * mask from before the sigpause is what we want ! 963: * restored after the signal processing is completed. ! 964: */ ! 965: (void) splhigh(); ! 966: if (ps->ps_flags & SA_OLDMASK) { ! 967: returnmask = ps->ps_oldmask; ! 968: ps->ps_flags &= ~SA_OLDMASK; ! 969: } else ! 970: returnmask = p->p_sigmask; ! 971: p->p_sigmask |= ps->ps_catchmask[sig] | mask; ! 972: (void) spl0(); ! 973: p->p_stats->p_ru.ru_nsignals++; ! 974: sendsig(action, sig, returnmask, 0); ! 975: } ! 976: } ! 977: ! 978: /* ! 979: * Force the current process to exit with the specified ! 980: * signal, dumping core if appropriate. We bypass the normal ! 981: * tests for masked and caught signals, allowing unrecoverable ! 982: * failures to terminate the process without changing signal state. ! 983: * Mark the accounting record with the signal termination. ! 984: * If dumping core, save the signal number for the debugger. ! 985: * Calls exit and does not return. ! 986: */ ! 987: sigexit(p, sig) ! 988: register struct proc *p; ! 989: int sig; ! 990: { ! 991: ! 992: p->p_acflag |= AXSIG; ! 993: if (sigprop[sig] & SA_CORE) { ! 994: p->p_sigacts->ps_sig = sig; ! 995: if (coredump(p) == 0) ! 996: sig |= WCOREFLAG; ! 997: } ! 998: exit(p, W_EXITCODE(0, sig)); ! 999: /* NOTREACHED */ ! 1000: } ! 1001: ! 1002: /* ! 1003: * Create a core dump. ! 1004: * The file name is "core.progname". ! 1005: * Core dumps are not created if the process is setuid. ! 1006: */ ! 1007: coredump(p) ! 1008: register struct proc *p; ! 1009: { ! 1010: register struct vnode *vp; ! 1011: register struct pcred *pcred = p->p_cred; ! 1012: register struct ucred *cred = pcred->pc_ucred; ! 1013: register struct vmspace *vm = p->p_vmspace; ! 1014: struct vattr vattr; ! 1015: int error, error1; ! 1016: struct nameidata nd; ! 1017: char name[MAXCOMLEN+6]; /* core.progname */ ! 1018: ! 1019: if (pcred->p_svuid != pcred->p_ruid || ! 1020: pcred->p_svgid != pcred->p_rgid) ! 1021: return (EFAULT); ! 1022: if (ctob(UPAGES + vm->vm_dsize + vm->vm_ssize) >= ! 1023: p->p_rlimit[RLIMIT_CORE].rlim_cur) ! 1024: return (EFAULT); ! 1025: sprintf(name, "core.%s", p->p_comm); ! 1026: nd.ni_dirp = name; ! 1027: nd.ni_segflg = UIO_SYSSPACE; ! 1028: if (error = vn_open(&nd, p, O_CREAT|FWRITE, 0644)) ! 1029: return (error); ! 1030: vp = nd.ni_vp; ! 1031: if (vp->v_type != VREG || VOP_GETATTR(vp, &vattr, cred, p) || ! 1032: vattr.va_nlink != 1) { ! 1033: error = EFAULT; ! 1034: goto out; ! 1035: } ! 1036: VATTR_NULL(&vattr); ! 1037: vattr.va_size = 0; ! 1038: VOP_SETATTR(vp, &vattr, cred, p); ! 1039: p->p_acflag |= ACORE; ! 1040: bcopy(p, &p->p_addr->u_kproc.kp_proc, sizeof(struct proc)); ! 1041: fill_eproc(p, &p->p_addr->u_kproc.kp_eproc); ! 1042: #ifdef HPUXCOMPAT ! 1043: /* ! 1044: * BLETCH! If we loaded from an HPUX format binary file ! 1045: * we have to dump an HPUX style user struct so that the ! 1046: * HPUX debuggers can grok it. ! 1047: */ ! 1048: if (p->p_addr->u_pcb.pcb_flags & PCB_HPUXBIN) ! 1049: error = hpuxdumpu(vp, cred); ! 1050: else ! 1051: #endif ! 1052: error = vn_rdwr(UIO_WRITE, vp, (caddr_t) p->p_addr, ctob(UPAGES), ! 1053: (off_t)0, UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, ! 1054: p); ! 1055: if (error == 0) ! 1056: error = vn_rdwr(UIO_WRITE, vp, vm->vm_daddr, ! 1057: (int)ctob(vm->vm_dsize), (off_t)ctob(UPAGES), UIO_USERSPACE, ! 1058: IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, p); ! 1059: if (error == 0) ! 1060: error = vn_rdwr(UIO_WRITE, vp, ! 1061: (caddr_t) trunc_page(USRSTACK - ctob(vm->vm_ssize)), ! 1062: round_page(ctob(vm->vm_ssize)), ! 1063: (off_t)ctob(UPAGES) + ctob(vm->vm_dsize), UIO_USERSPACE, ! 1064: IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, p); ! 1065: out: ! 1066: VOP_UNLOCK(vp); ! 1067: error1 = vn_close(vp, FWRITE, cred, p); ! 1068: if (error == 0) ! 1069: error = error1; ! 1070: return (error); ! 1071: } ! 1072: ! 1073: /* ! 1074: * Nonexistent system call-- signal process (may want to handle it). ! 1075: * Flag error in case process won't see signal immediately (blocked or ignored). ! 1076: */ ! 1077: /* ARGSUSED */ ! 1078: nosys(p, args, retval) ! 1079: struct proc *p; ! 1080: void *args; ! 1081: int *retval; ! 1082: { ! 1083: ! 1084: psignal(p, SIGSYS); ! 1085: return (EINVAL); ! 1086: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.