|
|
1.1 ! root 1: #include "sys/param.h" ! 2: #include "sys/systm.h" ! 3: #include "sys/user.h" ! 4: #include "sys/proc.h" ! 5: #include "sys/inode.h" ! 6: #include "sys/mtpr.h" ! 7: #include "sys/conf.h" ! 8: #include "sys/vlimit.h" ! 9: ! 10: /* ! 11: * Send the specified signal to ! 12: * all processes with 'pgrp' as ! 13: * process group. ! 14: * Called by tty code for quits and ! 15: * interrupts. ! 16: */ ! 17: gsignal(pgrp, sig) ! 18: register pgrp; ! 19: { ! 20: register struct proc *p; ! 21: ! 22: if(pgrp == 0) ! 23: return; ! 24: for(p = proc; p < procNPROC; p++) ! 25: if (p->p_stat != 0 && p->p_pgrp == pgrp) ! 26: psignal(p, sig); ! 27: } ! 28: ! 29: /* ! 30: * Send the specified signal to ! 31: * the specified process. ! 32: */ ! 33: psignal(p, sig) ! 34: register struct proc *p; ! 35: register int sig; ! 36: { ! 37: register s; ! 38: register int (*action)(); ! 39: long sigmask; ! 40: ! 41: if ((unsigned)sig >= NSIG ! 42: || p->p_stat == 0 || p->p_stat == SZOMB) ! 43: return; ! 44: sigmask = SIGMASK(sig); ! 45: ! 46: /* ! 47: * If proc is traced, always give parent a chance. ! 48: * Otherwise get the signal action from the bits in the proc table. ! 49: */ ! 50: if (p->p_flag & STRC) ! 51: action = SIG_DFL; ! 52: else ! 53: action = P_SIGVAL(p, sigmask); ! 54: if (action == SIG_IGN) ! 55: return; ! 56: #define stops (SIGMASK(SIGSTOP)|SIGMASK(SIGTSTP)|SIGMASK(SIGTTIN)|SIGMASK(SIGTTOU)) ! 57: if (sig) { ! 58: p->p_sig |= sigmask; ! 59: switch (sig) { ! 60: ! 61: case SIGTERM: ! 62: if ((p->p_flag&STRC) != 0 || action != SIG_DFL) ! 63: break; ! 64: /* fall into ... */ ! 65: ! 66: case SIGKILL: ! 67: if (p->p_nice > NZERO) ! 68: p->p_nice = NZERO; ! 69: break; ! 70: ! 71: case SIGCONT: ! 72: p->p_sig &= ~stops; ! 73: break; ! 74: ! 75: case SIGSTOP: ! 76: case SIGTSTP: ! 77: case SIGTTIN: ! 78: case SIGTTOU: ! 79: p->p_sig &= ~SIGMASK(SIGCONT); ! 80: break; ! 81: } ! 82: } ! 83: #undef stops ! 84: /* ! 85: * Defer further processing for signals which are held. ! 86: */ ! 87: if (action == SIG_HOLD) ! 88: return; ! 89: s = spl6(); ! 90: switch (p->p_stat) { ! 91: ! 92: case SSLEEP: ! 93: /* ! 94: * If process is sleeping at negative priority ! 95: * we can't interrupt the sleep... the signal will ! 96: * be noticed when the process returns through ! 97: * trap() or syscall(). ! 98: */ ! 99: if (p->p_pri <= PZERO) ! 100: goto out; ! 101: /* ! 102: * Process is sleeping and traced... make it runnable ! 103: * so it can discover the signal in issig() and stop ! 104: * for the parent. ! 105: */ ! 106: if (p->p_flag&STRC) ! 107: goto run; ! 108: switch (sig) { ! 109: ! 110: case SIGSTOP: ! 111: case SIGTSTP: ! 112: case SIGTTIN: ! 113: case SIGTTOU: ! 114: /* ! 115: * These are the signals which by default ! 116: * stop a process. ! 117: */ ! 118: if (action != SIG_DFL) ! 119: goto run; ! 120: /* ! 121: * Don't clog system with children of init ! 122: * stopped from the keyboard. ! 123: */ ! 124: if (sig != SIGSTOP && p->p_pptr == &proc[INITPID]) { ! 125: psignal(p, SIGKILL); ! 126: p->p_sig &= ~sigmask; ! 127: splx(s); ! 128: return; ! 129: } ! 130: p->p_sig &= ~sigmask; ! 131: p->p_cursig = sig; ! 132: stop(p); ! 133: goto out; ! 134: ! 135: case SIGTINT: ! 136: case SIGCHLD: ! 137: /* ! 138: * These signals are special in that they ! 139: * don't get propogated... if the process ! 140: * isn't interested, forget it. ! 141: */ ! 142: if (action != SIG_DFL) ! 143: goto run; ! 144: p->p_sig &= ~sigmask; /* take it away */ ! 145: goto out; ! 146: ! 147: default: ! 148: /* ! 149: * All other signals cause the process to run ! 150: */ ! 151: goto run; ! 152: } ! 153: /*NOTREACHED*/ ! 154: ! 155: case SSTOP: ! 156: /* ! 157: * If traced process is already stopped, ! 158: * then no further action is necessary, ! 159: * except to guarantee a sure SIGKILL and ! 160: * prevent multiple SIGSTOP's. ! 161: */ ! 162: if ((p->p_flag&STRC) && sig != SIGKILL && sig != SIGSTOP) ! 163: goto out; ! 164: switch (sig) { ! 165: ! 166: case SIGKILL: ! 167: /* ! 168: * Kill signal always sets processes running. ! 169: */ ! 170: goto run; ! 171: ! 172: case SIGCONT: ! 173: /* ! 174: * If the process catches SIGCONT, let it handle ! 175: * the signal itself. If it isn't waiting on ! 176: * an event, then it goes back to run state. ! 177: * Otherwise, process goes back to sleep state. ! 178: */ ! 179: if (action != SIG_DFL || p->p_wchan == 0) ! 180: goto run; ! 181: p->p_stat = SSLEEP; ! 182: goto out; ! 183: ! 184: case SIGSTOP: ! 185: case SIGTSTP: ! 186: case SIGTTIN: ! 187: case SIGTTOU: ! 188: /* ! 189: * Already stopped, don't need to stop again. ! 190: * (If we did the shell could get confused.) ! 191: */ ! 192: p->p_sig &= ~sigmask; /* take it away */ ! 193: goto out; ! 194: ! 195: default: ! 196: /* ! 197: * If process is sleeping interruptibly, then ! 198: * unstick it so that when it is continued ! 199: * it can look at the signal. ! 200: * But don't setrun the process as its not to ! 201: * be unstopped by the signal alone. ! 202: */ ! 203: if (p->p_wchan && p->p_pri > PZERO) ! 204: unsleep(p); ! 205: goto out; ! 206: } ! 207: /*NOTREACHED*/ ! 208: ! 209: default: ! 210: /* ! 211: * SRUN, SIDL, SZOMB do nothing with the signal, ! 212: * other than kicking ourselves if we are running. ! 213: * It will either never be noticed, or noticed very soon. ! 214: */ ! 215: if (p == u.u_procp && !noproc) ! 216: aston(); ! 217: goto out; ! 218: } ! 219: /*NOTREACHED*/ ! 220: run: ! 221: /* ! 222: * Raise priority to at least PUSER. ! 223: */ ! 224: if (p->p_pri > PUSER) ! 225: if ((p != u.u_procp || noproc) && p->p_stat == SRUN && ! 226: (p->p_flag & SLOAD)) { ! 227: remrq(p); ! 228: p->p_pri = PUSER; ! 229: setrq(p); ! 230: } else ! 231: p->p_pri = PUSER; ! 232: setrun(p); ! 233: out: ! 234: splx(s); ! 235: } ! 236: ! 237: /* ! 238: * Returns true if the current ! 239: * process has a signal to process. ! 240: * The signal to process is put in p_cursig. ! 241: * This is asked at least once each time a process enters the ! 242: * system (though this can usually be done without actually ! 243: * calling issig by checking the pending signal masks.) ! 244: * A signal does not do anything ! 245: * directly to a process; it sets ! 246: * a flag that asks the process to ! 247: * do something to itself. ! 248: */ ! 249: issig() ! 250: { ! 251: register struct proc *p = u.u_procp; ! 252: register int sig; ! 253: long sigbits, sigmask, trmask; ! 254: int (*action)(); ! 255: ! 256: for (;;) { ! 257: sigbits = p->p_sig; ! 258: if ((p->p_flag&STRC) == 0) ! 259: sigbits &= ~p->p_ignsig; ! 260: if (sigbits == 0) ! 261: break; ! 262: sig = (sigbits & SIGMASK(SIGKILL)) ? SIGKILL : ffs(sigbits); ! 263: sigmask = SIGMASK(sig); ! 264: p->p_sig &= ~sigmask; /* take the signal! */ ! 265: p->p_cursig = sig; ! 266: trmask = SIGMASK(SIGSTOP); /* SIGSTOP always traced */ ! 267: if (p->p_flag&STRC) { ! 268: register struct proc *pp = p; ! 269: do if (pp->p_trace) { ! 270: trmask |= pp->p_trace->i_un.i_sigmask; ! 271: break; ! 272: } while ((pp = pp->p_pptr) && pp->p_flag&STRC); ! 273: } ! 274: trmask &= sigmask & (~SIGMASK(SIGKILL)); ! 275: if (trmask) { ! 276: /* ! 277: * If traced, always stop. ! 278: */ ! 279: stop(p); ! 280: swtch(); ! 281: /* ! 282: * If debugger wants us to take the signal, ! 283: * then it will leave it in p->p_cursig; ! 284: * otherwise we just look for signals again. ! 285: */ ! 286: if ((sig = p->p_cursig) == 0) ! 287: continue; ! 288: } ! 289: if ((action = u.u_signal[sig]) == SIG_DFL) { ! 290: /* ! 291: * Don't take default actions on system processes. ! 292: */ ! 293: if (p->p_flag & SSYS) ! 294: break; ! 295: switch (sig) { ! 296: case SIGTSTP: ! 297: case SIGTTIN: ! 298: case SIGTTOU: ! 299: /* ! 300: * Children of init aren't allowed to stop ! 301: * on signals from the keyboard. ! 302: */ ! 303: if (p->p_pptr == &proc[INITPID]) { ! 304: psignal(p, SIGKILL); ! 305: continue; ! 306: } ! 307: /* fall into ... */ ! 308: ! 309: case SIGSTOP: ! 310: if (trmask) ! 311: continue; ! 312: stop(p); ! 313: swtch(); ! 314: continue; ! 315: ! 316: case SIGTINT: ! 317: case SIGCONT: ! 318: case SIGCHLD: ! 319: /* ! 320: * These signals are normally not ! 321: * sent if the action is the default. ! 322: * This can happen only if you reset the ! 323: * signal action from an action which was ! 324: * not deferred to SIG_DFL before the ! 325: * system gets a chance to post the signal. ! 326: */ ! 327: continue; /* == ignore */ ! 328: ! 329: default: ! 330: goto send; ! 331: } ! 332: } else if (action == SIG_IGN || action == SIG_HOLD) { ! 333: /* ! 334: * shouldn't happen unless process traced; ! 335: * see psignal ! 336: */ ! 337: if ((p->p_flag&STRC) == 0) ! 338: printf("issig %d\n", sig); ! 339: continue; ! 340: } else { ! 341: /* ! 342: * This signal has an action, let ! 343: * psig process it. ! 344: */ ! 345: goto send; ! 346: } ! 347: } ! 348: /* ! 349: * Didn't find a signal to send. ! 350: */ ! 351: p->p_cursig = 0; ! 352: return (0); ! 353: ! 354: send: ! 355: /* ! 356: * Let psig process the signal. ! 357: */ ! 358: return (sig); ! 359: } ! 360: ! 361: #ifndef vax ! 362: ffs(mask) ! 363: register long mask; ! 364: { ! 365: register int i; ! 366: ! 367: for(i=1; i<NSIG; i++) { ! 368: if(mask & 1) ! 369: return(i); ! 370: mask >>= 1; ! 371: } ! 372: return(0); ! 373: } ! 374: #endif ! 375: ! 376: /* ! 377: * Put the argument process into the stopped ! 378: * state and notify the parent via wakeup and/or signal. ! 379: */ ! 380: stop(p) ! 381: register struct proc *p; ! 382: { ! 383: ! 384: p->p_stat = SSTOP; ! 385: p->p_flag &= ~SWTED; ! 386: wakeup((caddr_t)p->p_pptr); ! 387: wakeup((caddr_t)p->p_trace); ! 388: /* ! 389: * Avoid sending signal to parent if process is traced ! 390: */ ! 391: if (p->p_flag&STRC) ! 392: return; ! 393: psignal(p->p_pptr, SIGCHLD); ! 394: } ! 395: ! 396: /* ! 397: * Perform the action specified by ! 398: * the current signal. ! 399: * The usual sequence is: ! 400: * if(issig()) ! 401: * psig(); ! 402: * The signal bit has already been cleared by issig, ! 403: * and the current signal number stored in p->p_cursig. ! 404: */ ! 405: psig() ! 406: { ! 407: register struct proc *rp = u.u_procp; ! 408: register int n = rp->p_cursig; ! 409: long sigmask = SIGMASK(n); ! 410: register int (*action)(); ! 411: ! 412: if (rp->p_cursig == 0) ! 413: panic("psig"); ! 414: action = u.u_signal[n]; ! 415: if (action != SIG_DFL) { ! 416: if (action == SIG_IGN || action == SIG_HOLD) ! 417: panic("psig action"); ! 418: u.u_error = 0; ! 419: if(n != SIGILL && n != SIGTRAP) ! 420: u.u_signal[n] = 0; ! 421: /* ! 422: * If this catch value indicates automatic holding of ! 423: * subsequent signals, set the hold value. ! 424: */ ! 425: if (SIGISDEFER(action)) { ! 426: (void) spl6(); ! 427: P_SETHOLD(rp, sigmask); ! 428: u.u_signal[n] = SIG_HOLD; ! 429: (void) spl0(); ! 430: action = SIGUNDEFER(action); ! 431: } ! 432: sendsig(action, n); ! 433: rp->p_cursig = 0; ! 434: return; ! 435: } ! 436: switch (n) { ! 437: ! 438: case SIGILL: ! 439: case SIGIOT: ! 440: case SIGBUS: ! 441: case SIGQUIT: ! 442: case SIGTRAP: ! 443: case SIGEMT: ! 444: case SIGFPE: ! 445: case SIGSEGV: ! 446: case SIGSYS: ! 447: u.u_arg[0] = n; ! 448: if(core()) ! 449: n += 0200; ! 450: } ! 451: exit(n); ! 452: } ! 453: ! 454: /* ! 455: * Create a core image on the file "core" ! 456: * If you are looking for protection glitches, ! 457: * there are probably a wealth of them here ! 458: * when this occurs to a suid command. ! 459: * ! 460: * It writes UPAGES block of the ! 461: * user.h area followed by the entire ! 462: * data+stack segments. ! 463: */ ! 464: core() ! 465: { ! 466: register struct inode *ip; ! 467: struct argnamei nmarg; ! 468: struct proc coreproc; ! 469: ! 470: if (ctob(UPAGES+u.u_dsize+u.u_ssize) >= u.u_limit[LIM_CORE]) ! 471: return (0); ! 472: coreproc = *u.u_procp; ! 473: u.u_stack[0] = (int)&coreproc; ! 474: u.u_error = 0; ! 475: u.u_uid = u.u_ruid; ! 476: u.u_gid = u.u_rgid; ! 477: nmarg = nilargnamei; ! 478: nmarg.flag = NI_CREAT; ! 479: nmarg.un.mode = 0666 &~ u.u_cmask; ! 480: ip = namei("core", SEGSYS, &nmarg, 1); ! 481: if(ip == NULL) ! 482: return(0); ! 483: if(!access(ip, IWRITE) && ! 484: (ip->i_mode&IFMT) == IFREG && ip->i_nlink==1) { ! 485: (*fstypsw[ip->i_fstyp]->t_trunc)(ip); ! 486: u.u_offset = ltoL(0); ! 487: u.u_base = (caddr_t)&u; ! 488: u.u_count = ctob(UPAGES); ! 489: u.u_segflg = SEGSYS; ! 490: writei(ip); ! 491: u.u_base = (char *)ctob(u.u_tsize); ! 492: u.u_count = ctob(u.u_dsize); ! 493: u.u_segflg = SEGUDATA; ! 494: writei(ip); ! 495: u.u_base = (char *)(USRSTACK - ctob(u.u_ssize)); ! 496: u.u_count = ctob(u.u_ssize); ! 497: writei(ip); ! 498: } else ! 499: u.u_error = EFAULT; ! 500: iput(ip); ! 501: return(u.u_error==0); ! 502: } ! 503: ! 504: /* ! 505: * grow the stack to include the SP ! 506: * true return if successful. ! 507: */ ! 508: grow(sp) ! 509: unsigned sp; ! 510: { ! 511: register si; ! 512: ! 513: if(sp >= USRSTACK-ctob(u.u_ssize)) ! 514: return(0); ! 515: si = clrnd(btoc((USRSTACK-sp)) - u.u_ssize + SINCR); ! 516: if (ctob(u.u_ssize+si) > u.u_limit[LIM_STACK]) ! 517: return(0); ! 518: if (chksize(u.u_tsize, u.u_dsize, u.u_ssize+si)) ! 519: return(0); ! 520: if (swpexpand(u.u_dsize, u.u_ssize+si, &u.u_dmap, &u.u_smap)==0) ! 521: return(0); ! 522: ! 523: expand(si, P1BR); ! 524: return(1); ! 525: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.