1: /*
   2:  * Copyright (c) 1982, 1986 Regents of the University of California.
   3:  * All rights reserved.  The Berkeley software License Agreement
   4:  * specifies the terms and conditions for redistribution.
   5:  *
   6:  *	@(#)kern_sig.c	7.1 (Berkeley) 6/5/86
   7:  */
   8: 
   9: #include "../machine/reg.h"
  10: #include "../machine/pte.h"
  11: #include "../machine/psl.h"
  12: 
  13: #include "param.h"
  14: #include "systm.h"
  15: #include "dir.h"
  16: #include "user.h"
  17: #include "inode.h"
  18: #include "proc.h"
  19: #include "timeb.h"
  20: #include "times.h"
  21: #include "buf.h"
  22: #include "mount.h"
  23: #include "text.h"
  24: #include "seg.h"
  25: #include "vm.h"
  26: #include "acct.h"
  27: #include "uio.h"
  28: #include "kernel.h"
  29: 
  30: #define cantmask    (sigmask(SIGKILL)|sigmask(SIGCONT)|sigmask(SIGSTOP))
  31: #define stopsigmask (sigmask(SIGSTOP)|sigmask(SIGTSTP)| \
  32:             sigmask(SIGTTIN)|sigmask(SIGTTOU))
  33: 
  34: /*
  35:  * Generalized interface signal handler.
  36:  */
  37: sigvec()
  38: {
  39:     register struct a {
  40:         int signo;
  41:         struct  sigvec *nsv;
  42:         struct  sigvec *osv;
  43:     } *uap = (struct a  *)u.u_ap;
  44:     struct sigvec vec;
  45:     register struct sigvec *sv;
  46:     register int sig;
  47:     int bit;
  48: 
  49:     sig = uap->signo;
  50:     if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) {
  51:         u.u_error = EINVAL;
  52:         return;
  53:     }
  54:     sv = &vec;
  55:     if (uap->osv) {
  56:         sv->sv_handler = u.u_signal[sig];
  57:         sv->sv_mask = u.u_sigmask[sig];
  58:         bit = sigmask(sig);
  59:         sv->sv_flags = 0;
  60:         if ((u.u_sigonstack & bit) != 0)
  61:             sv->sv_flags |= SV_ONSTACK;
  62:         if ((u.u_sigintr & bit) != 0)
  63:             sv->sv_flags |= SV_INTERRUPT;
  64:         u.u_error =
  65:             copyout((caddr_t)sv, (caddr_t)uap->osv, sizeof (vec));
  66:         if (u.u_error)
  67:             return;
  68:     }
  69:     if (uap->nsv) {
  70:         u.u_error =
  71:             copyin((caddr_t)uap->nsv, (caddr_t)sv, sizeof (vec));
  72:         if (u.u_error)
  73:             return;
  74:         if (sig == SIGCONT && sv->sv_handler == SIG_IGN) {
  75:             u.u_error = EINVAL;
  76:             return;
  77:         }
  78:         setsigvec(sig, sv);
  79:     }
  80: }
  81: 
  82: setsigvec(sig, sv)
  83:     int sig;
  84:     register struct sigvec *sv;
  85: {
  86:     register struct proc *p;
  87:     register int bit;
  88: 
  89:     bit = sigmask(sig);
  90:     p = u.u_procp;
  91:     /*
  92: 	 * Change setting atomically.
  93: 	 */
  94:     (void) splhigh();
  95:     u.u_signal[sig] = sv->sv_handler;
  96:     u.u_sigmask[sig] = sv->sv_mask &~ cantmask;
  97:     if (sv->sv_flags & SV_INTERRUPT)
  98:         u.u_sigintr |= bit;
  99:     else
 100:         u.u_sigintr &= ~bit;
 101:     if (sv->sv_flags & SV_ONSTACK)
 102:         u.u_sigonstack |= bit;
 103:     else
 104:         u.u_sigonstack &= ~bit;
 105:     if (sv->sv_handler == SIG_IGN) {
 106:         p->p_sig &= ~bit;       /* never to be seen again */
 107:         p->p_sigignore |= bit;
 108:         p->p_sigcatch &= ~bit;
 109:     } else {
 110:         p->p_sigignore &= ~bit;
 111:         if (sv->sv_handler == SIG_DFL)
 112:             p->p_sigcatch &= ~bit;
 113:         else
 114:             p->p_sigcatch |= bit;
 115:     }
 116:     (void) spl0();
 117: }
 118: 
 119: sigblock()
 120: {
 121:     struct a {
 122:         int mask;
 123:     } *uap = (struct a *)u.u_ap;
 124:     register struct proc *p = u.u_procp;
 125: 
 126:     (void) splhigh();
 127:     u.u_r.r_val1 = p->p_sigmask;
 128:     p->p_sigmask |= uap->mask &~ cantmask;
 129:     (void) spl0();
 130: }
 131: 
 132: sigsetmask()
 133: {
 134:     struct a {
 135:         int mask;
 136:     } *uap = (struct a *)u.u_ap;
 137:     register struct proc *p = u.u_procp;
 138: 
 139:     (void) splhigh();
 140:     u.u_r.r_val1 = p->p_sigmask;
 141:     p->p_sigmask = uap->mask &~ cantmask;
 142:     (void) spl0();
 143: }
 144: 
 145: sigpause()
 146: {
 147:     struct a {
 148:         int mask;
 149:     } *uap = (struct a *)u.u_ap;
 150:     register struct proc *p = u.u_procp;
 151: 
 152:     /*
 153: 	 * When returning from sigpause, we want
 154: 	 * the old mask to be restored after the
 155: 	 * signal handler has finished.  Thus, we
 156: 	 * save it here and mark the proc structure
 157: 	 * to indicate this (should be in u.).
 158: 	 */
 159:     u.u_oldmask = p->p_sigmask;
 160:     p->p_flag |= SOMASK;
 161:     p->p_sigmask = uap->mask &~ cantmask;
 162:     for (;;)
 163:         sleep((caddr_t)&u, PSLEP);
 164:     /*NOTREACHED*/
 165: }
 166: #undef cantmask
 167: 
 168: sigstack()
 169: {
 170:     register struct a {
 171:         struct  sigstack *nss;
 172:         struct  sigstack *oss;
 173:     } *uap = (struct a *)u.u_ap;
 174:     struct sigstack ss;
 175: 
 176:     if (uap->oss) {
 177:         u.u_error = copyout((caddr_t)&u.u_sigstack, (caddr_t)uap->oss,
 178:             sizeof (struct sigstack));
 179:         if (u.u_error)
 180:             return;
 181:     }
 182:     if (uap->nss) {
 183:         u.u_error =
 184:             copyin((caddr_t)uap->nss, (caddr_t)&ss, sizeof (ss));
 185:         if (u.u_error == 0)
 186:             u.u_sigstack = ss;
 187:     }
 188: }
 189: 
 190: kill()
 191: {
 192:     register struct a {
 193:         int pid;
 194:         int signo;
 195:     } *uap = (struct a *)u.u_ap;
 196:     register struct proc *p;
 197: 
 198:     if (uap->signo < 0 || uap->signo > NSIG) {
 199:         u.u_error = EINVAL;
 200:         return;
 201:     }
 202:     if (uap->pid > 0) {
 203:         /* kill single process */
 204:         p = pfind(uap->pid);
 205:         if (p == 0) {
 206:             u.u_error = ESRCH;
 207:             return;
 208:         }
 209:         if (u.u_uid && u.u_uid != p->p_uid)
 210:             u.u_error = EPERM;
 211:         else if (uap->signo)
 212:             psignal(p, uap->signo);
 213:         return;
 214:     }
 215:     switch (uap->pid) {
 216:     case -1:        /* broadcast signal */
 217:         u.u_error = killpg1(uap->signo, 0, 1);
 218:         break;
 219:     case 0:         /* signal own process group */
 220:         u.u_error = killpg1(uap->signo, 0, 0);
 221:         break;
 222:     default:        /* negative explicit process group */
 223:         u.u_error = killpg1(uap->signo, -uap->pid, 0);
 224:         break;
 225:     }
 226:     return;
 227: }
 228: 
 229: killpg()
 230: {
 231:     register struct a {
 232:         int pgrp;
 233:         int signo;
 234:     } *uap = (struct a *)u.u_ap;
 235: 
 236:     if (uap->signo < 0 || uap->signo > NSIG) {
 237:         u.u_error = EINVAL;
 238:         return;
 239:     }
 240:     u.u_error = killpg1(uap->signo, uap->pgrp, 0);
 241: }
 242: 
 243: /* KILL CODE SHOULDNT KNOW ABOUT PROCESS INTERNALS !?! */
 244: 
 245: killpg1(signo, pgrp, all)
 246:     int signo, pgrp, all;
 247: {
 248:     register struct proc *p;
 249:     int f, error = 0;
 250: 
 251:     if (!all && pgrp == 0) {
 252:         /*
 253: 		 * Zero process id means send to my process group.
 254: 		 */
 255:         pgrp = u.u_procp->p_pgrp;
 256:         if (pgrp == 0)
 257:             return (ESRCH);
 258:     }
 259:     for (f = 0, p = allproc; p != NULL; p = p->p_nxt) {
 260:         if ((p->p_pgrp != pgrp && !all) || p->p_ppid == 0 ||
 261:             (p->p_flag&SSYS) || (all && p == u.u_procp))
 262:             continue;
 263:         if (u.u_uid != 0 && u.u_uid != p->p_uid &&
 264:             (signo != SIGCONT || !inferior(p))) {
 265:             if (!all)
 266:                 error = EPERM;
 267:             continue;
 268:         }
 269:         f++;
 270:         if (signo)
 271:             psignal(p, signo);
 272:     }
 273:     return (error ? error : (f == 0 ? ESRCH : 0));
 274: }
 275: 
 276: /*
 277:  * Send the specified signal to
 278:  * all processes with 'pgrp' as
 279:  * process group.
 280:  */
 281: gsignal(pgrp, sig)
 282:     register int pgrp;
 283: {
 284:     register struct proc *p;
 285: 
 286:     if (pgrp == 0)
 287:         return;
 288:     for (p = allproc; p != NULL; p = p->p_nxt)
 289:         if (p->p_pgrp == pgrp)
 290:             psignal(p, sig);
 291: }
 292: 
 293: /*
 294:  * Send the specified signal to
 295:  * the specified process.
 296:  */
 297: psignal(p, sig)
 298:     register struct proc *p;
 299:     register int sig;
 300: {
 301:     register int s;
 302:     register int (*action)();
 303:     int mask;
 304: 
 305:     if ((unsigned)sig >= NSIG)
 306:         return;
 307:     mask = sigmask(sig);
 308: 
 309:     /*
 310: 	 * If proc is traced, always give parent a chance.
 311: 	 */
 312:     if (p->p_flag & STRC)
 313:         action = SIG_DFL;
 314:     else {
 315:         /*
 316: 		 * If the signal is being ignored,
 317: 		 * then we forget about it immediately.
 318: 		 */
 319:         if (p->p_sigignore & mask)
 320:             return;
 321:         if (p->p_sigmask & mask)
 322:             action = SIG_HOLD;
 323:         else if (p->p_sigcatch & mask)
 324:             action = SIG_CATCH;
 325:         else
 326:             action = SIG_DFL;
 327:     }
 328:     if (sig) {
 329:         p->p_sig |= mask;
 330:         switch (sig) {
 331: 
 332:         case SIGTERM:
 333:             if ((p->p_flag&STRC) || action != SIG_DFL)
 334:                 break;
 335:             /* fall into ... */
 336: 
 337:         case SIGKILL:
 338:             if (p->p_nice > NZERO)
 339:                 p->p_nice = NZERO;
 340:             break;
 341: 
 342:         case SIGCONT:
 343:             p->p_sig &= ~stopsigmask;
 344:             break;
 345: 
 346:         case SIGSTOP:
 347:         case SIGTSTP:
 348:         case SIGTTIN:
 349:         case SIGTTOU:
 350:             p->p_sig &= ~sigmask(SIGCONT);
 351:             break;
 352:         }
 353:     }
 354:     /*
 355: 	 * Defer further processing for signals which are held.
 356: 	 */
 357:     if (action == SIG_HOLD)
 358:         return;
 359:     s = splhigh();
 360:     switch (p->p_stat) {
 361: 
 362:     case SSLEEP:
 363:         /*
 364: 		 * If process is sleeping at negative priority
 365: 		 * we can't interrupt the sleep... the signal will
 366: 		 * be noticed when the process returns through
 367: 		 * trap() or syscall().
 368: 		 */
 369:         if (p->p_pri <= PZERO)
 370:             goto out;
 371:         /*
 372: 		 * Process is sleeping and traced... make it runnable
 373: 		 * so it can discover the signal in issig() and stop
 374: 		 * for the parent.
 375: 		 */
 376:         if (p->p_flag&STRC)
 377:             goto run;
 378:         switch (sig) {
 379: 
 380:         case SIGSTOP:
 381:         case SIGTSTP:
 382:         case SIGTTIN:
 383:         case SIGTTOU:
 384:             /*
 385: 			 * These are the signals which by default
 386: 			 * stop a process.
 387: 			 */
 388:             if (action != SIG_DFL)
 389:                 goto run;
 390:             /*
 391: 			 * Don't clog system with children of init
 392: 			 * stopped from the keyboard.
 393: 			 */
 394:             if (sig != SIGSTOP && p->p_pptr == &proc[1]) {
 395:                 psignal(p, SIGKILL);
 396:                 p->p_sig &= ~mask;
 397:                 splx(s);
 398:                 return;
 399:             }
 400:             /*
 401: 			 * If a child in vfork(), stopping could
 402: 			 * cause deadlock.
 403: 			 */
 404:             if (p->p_flag&SVFORK)
 405:                 goto out;
 406:             p->p_sig &= ~mask;
 407:             p->p_cursig = sig;
 408:             psignal(p->p_pptr, SIGCHLD);
 409:             stop(p);
 410:             goto out;
 411: 
 412:         case SIGIO:
 413:         case SIGURG:
 414:         case SIGCHLD:
 415:         case SIGWINCH:
 416:             /*
 417: 			 * These signals are special in that they
 418: 			 * don't get propogated... if the process
 419: 			 * isn't interested, forget it.
 420: 			 */
 421:             if (action != SIG_DFL)
 422:                 goto run;
 423:             p->p_sig &= ~mask;      /* take it away */
 424:             goto out;
 425: 
 426:         default:
 427:             /*
 428: 			 * All other signals cause the process to run
 429: 			 */
 430:             goto run;
 431:         }
 432:         /*NOTREACHED*/
 433: 
 434:     case SSTOP:
 435:         /*
 436: 		 * If traced process is already stopped,
 437: 		 * then no further action is necessary.
 438: 		 */
 439:         if (p->p_flag&STRC)
 440:             goto out;
 441:         switch (sig) {
 442: 
 443:         case SIGKILL:
 444:             /*
 445: 			 * Kill signal always sets processes running.
 446: 			 */
 447:             goto run;
 448: 
 449:         case SIGCONT:
 450:             /*
 451: 			 * If the process catches SIGCONT, let it handle
 452: 			 * the signal itself.  If it isn't waiting on
 453: 			 * an event, then it goes back to run state.
 454: 			 * Otherwise, process goes back to sleep state.
 455: 			 */
 456:             if (action != SIG_DFL || p->p_wchan == 0)
 457:                 goto run;
 458:             p->p_stat = SSLEEP;
 459:             goto out;
 460: 
 461:         case SIGSTOP:
 462:         case SIGTSTP:
 463:         case SIGTTIN:
 464:         case SIGTTOU:
 465:             /*
 466: 			 * Already stopped, don't need to stop again.
 467: 			 * (If we did the shell could get confused.)
 468: 			 */
 469:             p->p_sig &= ~mask;      /* take it away */
 470:             goto out;
 471: 
 472:         default:
 473:             /*
 474: 			 * If process is sleeping interruptibly, then
 475: 			 * unstick it so that when it is continued
 476: 			 * it can look at the signal.
 477: 			 * But don't setrun the process as its not to
 478: 			 * be unstopped by the signal alone.
 479: 			 */
 480:             if (p->p_wchan && p->p_pri > PZERO)
 481:                 unsleep(p);
 482:             goto out;
 483:         }
 484:         /*NOTREACHED*/
 485: 
 486:     default:
 487:         /*
 488: 		 * SRUN, SIDL, SZOMB do nothing with the signal,
 489: 		 * other than kicking ourselves if we are running.
 490: 		 * It will either never be noticed, or noticed very soon.
 491: 		 */
 492:         if (p == u.u_procp && !noproc)
 493: #include "../vax/mtpr.h"
 494:             aston();
 495:         goto out;
 496:     }
 497:     /*NOTREACHED*/
 498: run:
 499:     /*
 500: 	 * Raise priority to at least PUSER.
 501: 	 */
 502:     if (p->p_pri > PUSER)
 503:         p->p_pri = PUSER;
 504:     setrun(p);
 505: out:
 506:     splx(s);
 507: }
 508: 
 509: /*
 510:  * Returns true if the current
 511:  * process has a signal to process.
 512:  * The signal to process is put in p_cursig.
 513:  * This is asked at least once each time a process enters the
 514:  * system (though this can usually be done without actually
 515:  * calling issig by checking the pending signal masks.)
 516:  * A signal does not do anything
 517:  * directly to a process; it sets
 518:  * a flag that asks the process to
 519:  * do something to itself.
 520:  */
 521: issig()
 522: {
 523:     register struct proc *p;
 524:     register int sig;
 525:     int sigbits, mask;
 526: 
 527:     p = u.u_procp;
 528:     for (;;) {
 529:         sigbits = p->p_sig &~ p->p_sigmask;
 530:         if ((p->p_flag&STRC) == 0)
 531:             sigbits &= ~p->p_sigignore;
 532:         if (p->p_flag&SVFORK)
 533:             sigbits &= ~stopsigmask;
 534:         if (sigbits == 0)
 535:             break;
 536:         sig = ffs((long)sigbits);
 537:         mask = sigmask(sig);
 538:         p->p_sig &= ~mask;      /* take the signal! */
 539:         p->p_cursig = sig;
 540:         if (p->p_flag&STRC && (p->p_flag&SVFORK) == 0) {
 541:             /*
 542: 			 * If traced, always stop, and stay
 543: 			 * stopped until released by the parent.
 544: 			 */
 545:             psignal(p->p_pptr, SIGCHLD);
 546:             do {
 547:                 stop(p);
 548:                 swtch();
 549:             } while (!procxmt() && p->p_flag&STRC);
 550: 
 551:             /*
 552: 			 * If the traced bit got turned off,
 553: 			 * then put the signal taken above back into p_sig
 554: 			 * and go back up to the top to rescan signals.
 555: 			 * This ensures that p_sig* and u_signal are consistent.
 556: 			 */
 557:             if ((p->p_flag&STRC) == 0) {
 558:                 p->p_sig |= mask;
 559:                 continue;
 560:             }
 561: 
 562:             /*
 563: 			 * If parent wants us to take the signal,
 564: 			 * then it will leave it in p->p_cursig;
 565: 			 * otherwise we just look for signals again.
 566: 			 */
 567:             sig = p->p_cursig;
 568:             if (sig == 0)
 569:                 continue;
 570: 
 571:             /*
 572: 			 * If signal is being masked put it back
 573: 			 * into p_sig and look for other signals.
 574: 			 */
 575:             mask = sigmask(sig);
 576:             if (p->p_sigmask & mask) {
 577:                 p->p_sig |= mask;
 578:                 continue;
 579:             }
 580:         }
 581:         switch ((int)u.u_signal[sig]) {
 582: 
 583:         case SIG_DFL:
 584:             /*
 585: 			 * Don't take default actions on system processes.
 586: 			 */
 587:             if (p->p_ppid == 0)
 588:                 break;
 589:             switch (sig) {
 590: 
 591:             case SIGTSTP:
 592:             case SIGTTIN:
 593:             case SIGTTOU:
 594:                 /*
 595: 				 * Children of init aren't allowed to stop
 596: 				 * on signals from the keyboard.
 597: 				 */
 598:                 if (p->p_pptr == &proc[1]) {
 599:                     psignal(p, SIGKILL);
 600:                     continue;
 601:                 }
 602:                 /* fall into ... */
 603: 
 604:             case SIGSTOP:
 605:                 if (p->p_flag&STRC)
 606:                     continue;
 607:                 psignal(p->p_pptr, SIGCHLD);
 608:                 stop(p);
 609:                 swtch();
 610:                 continue;
 611: 
 612:             case SIGCONT:
 613:             case SIGCHLD:
 614:             case SIGURG:
 615:             case SIGIO:
 616:             case SIGWINCH:
 617:                 /*
 618: 				 * These signals are normally not
 619: 				 * sent if the action is the default.
 620: 				 */
 621:                 continue;       /* == ignore */
 622: 
 623:             default:
 624:                 goto send;
 625:             }
 626:             /*NOTREACHED*/
 627: 
 628:         case SIG_HOLD:
 629:         case SIG_IGN:
 630:             /*
 631: 			 * Masking above should prevent us
 632: 			 * ever trying to take action on a held
 633: 			 * or ignored signal, unless process is traced.
 634: 			 */
 635:             if ((p->p_flag&STRC) == 0)
 636:                 printf("issig\n");
 637:             continue;
 638: 
 639:         default:
 640:             /*
 641: 			 * This signal has an action, let
 642: 			 * psig process it.
 643: 			 */
 644:             goto send;
 645:         }
 646:         /*NOTREACHED*/
 647:     }
 648:     /*
 649: 	 * Didn't find a signal to send.
 650: 	 */
 651:     p->p_cursig = 0;
 652:     return (0);
 653: 
 654: send:
 655:     /*
 656: 	 * Let psig process the signal.
 657: 	 */
 658:     return (sig);
 659: }
 660: 
 661: /*
 662:  * Put the argument process into the stopped
 663:  * state and notify the parent via wakeup.
 664:  * Signals are handled elsewhere.
 665:  */
 666: stop(p)
 667:     register struct proc *p;
 668: {
 669: 
 670:     p->p_stat = SSTOP;
 671:     p->p_flag &= ~SWTED;
 672:     wakeup((caddr_t)p->p_pptr);
 673: }
 674: 
 675: /*
 676:  * Perform the action specified by
 677:  * the current signal.
 678:  * The usual sequence is:
 679:  *	if (issig())
 680:  *		psig();
 681:  * The signal bit has already been cleared by issig,
 682:  * and the current signal number stored in p->p_cursig.
 683:  */
 684: psig()
 685: {
 686:     register struct proc *p = u.u_procp;
 687:     register int sig = p->p_cursig;
 688:     int mask = sigmask(sig), returnmask;
 689:     register int (*action)();
 690: 
 691:     if (sig == 0)
 692:         panic("psig");
 693:     action = u.u_signal[sig];
 694:     if (action != SIG_DFL) {
 695:         if (action == SIG_IGN || (p->p_sigmask & mask))
 696:             panic("psig action");
 697:         u.u_error = 0;
 698:         /*
 699: 		 * Set the new mask value and also defer further
 700: 		 * occurences of this signal (unless we're simulating
 701: 		 * the old signal facilities).
 702: 		 *
 703: 		 * Special case: user has done a sigpause.  Here the
 704: 		 * current mask is not of interest, but rather the
 705: 		 * mask from before the sigpause is what we want restored
 706: 		 * after the signal processing is completed.
 707: 		 */
 708:         (void) splhigh();
 709:         if (p->p_flag & SOUSIG) {
 710:             if (sig != SIGILL && sig != SIGTRAP) {
 711:                 u.u_signal[sig] = SIG_DFL;
 712:                 p->p_sigcatch &= ~mask;
 713:             }
 714:             mask = 0;
 715:         }
 716:         if (p->p_flag & SOMASK) {
 717:             returnmask = u.u_oldmask;
 718:             p->p_flag &= ~SOMASK;
 719:         } else
 720:             returnmask = p->p_sigmask;
 721:         p->p_sigmask |= u.u_sigmask[sig] | mask;
 722:         (void) spl0();
 723:         u.u_ru.ru_nsignals++;
 724:         sendsig(action, sig, returnmask);
 725:         p->p_cursig = 0;
 726:         return;
 727:     }
 728:     u.u_acflag |= AXSIG;
 729:     switch (sig) {
 730: 
 731:     case SIGILL:
 732:     case SIGIOT:
 733:     case SIGBUS:
 734:     case SIGQUIT:
 735:     case SIGTRAP:
 736:     case SIGEMT:
 737:     case SIGFPE:
 738:     case SIGSEGV:
 739:     case SIGSYS:
 740:         u.u_arg[0] = sig;
 741:         if (core())
 742:             sig += 0200;
 743:     }
 744:     exit(sig);
 745: }
 746: 
 747: /*
 748:  * Create a core image on the file "core"
 749:  * If you are looking for protection glitches,
 750:  * there are probably a wealth of them here
 751:  * when this occurs to a suid command.
 752:  *
 753:  * It writes UPAGES block of the
 754:  * user.h area followed by the entire
 755:  * data+stack segments.
 756:  */
 757: core()
 758: {
 759:     register struct inode *ip;
 760:     register struct nameidata *ndp = &u.u_nd;
 761: 
 762:     if (u.u_uid != u.u_ruid || u.u_gid != u.u_rgid)
 763:         return (0);
 764:     if (ctob(UPAGES+u.u_dsize+u.u_ssize) >=
 765:         u.u_rlimit[RLIMIT_CORE].rlim_cur)
 766:         return (0);
 767:     if (u.u_procp->p_textp && access(u.u_procp->p_textp->x_iptr, IREAD))
 768:         return (0);
 769:     u.u_error = 0;
 770:     ndp->ni_nameiop = CREATE | FOLLOW;
 771:     ndp->ni_segflg = UIO_SYSSPACE;
 772:     ndp->ni_dirp = "core";
 773:     ip = namei(ndp);
 774:     if (ip == NULL) {
 775:         if (u.u_error)
 776:             return (0);
 777:         ip = maknode(0644, ndp);
 778:         if (ip==NULL)
 779:             return (0);
 780:     }
 781:     if (access(ip, IWRITE) ||
 782:        (ip->i_mode&IFMT) != IFREG ||
 783:        ip->i_nlink != 1) {
 784:         u.u_error = EFAULT;
 785:         goto out;
 786:     }
 787:     itrunc(ip, (u_long)0);
 788:     u.u_acflag |= ACORE;
 789:     u.u_error = rdwri(UIO_WRITE, ip,
 790:         (caddr_t)&u,
 791:         ctob(UPAGES),
 792:         (off_t)0, 1, (int *)0);
 793:     if (u.u_error == 0)
 794:         u.u_error = rdwri(UIO_WRITE, ip,
 795:             (caddr_t)ctob(dptov(u.u_procp, 0)),
 796:             (int)ctob(u.u_dsize),
 797:             (off_t)ctob(UPAGES), 0, (int *)0);
 798:     if (u.u_error == 0)
 799:         u.u_error = rdwri(UIO_WRITE, ip,
 800:             (caddr_t)ctob(sptov(u.u_procp, u.u_ssize - 1)),
 801:             (int)ctob(u.u_ssize),
 802:             (off_t)ctob(UPAGES)+ctob(u.u_dsize), 0, (int *)0);
 803: out:
 804:     iput(ip);
 805:     return (u.u_error == 0);
 806: }

Defined functions

core defined in line 757; used 1 times
issig defined in line 521; used 1 times
kill defined in line 190; used 2 times
killpg defined in line 229; used 2 times
killpg1 defined in line 245; used 4 times
psig defined in line 684; used 2 times
setsigvec defined in line 82; used 2 times
sigblock defined in line 119; used 2 times
sigpause defined in line 145; used 2 times
sigsetmask defined in line 132; used 2 times
sigstack defined in line 168; used 2 times
sigvec defined in line 37; used 2 times
stop defined in line 666; used 3 times

Defined struct's

a defined in line 231; used 14 times

Defined macros

cantmask defined in line 30; used 5 times
stopsigmask defined in line 31; used 2 times
Last modified: 1986-06-05
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1402
Valid CSS Valid XHTML 1.0 Strict