X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/99fa88a2ea75afd8033401c50450f6b64ef823d1..8643403fcca8dfc555514e7ca5ae392a0d8d476e:/usr/src/sys/kern/kern_proc.c diff --git a/usr/src/sys/kern/kern_proc.c b/usr/src/sys/kern/kern_proc.c index 4b14300854..81a4de2757 100644 --- a/usr/src/sys/kern/kern_proc.c +++ b/usr/src/sys/kern/kern_proc.c @@ -1,4 +1,4 @@ -/* kern_proc.c 3.6 %H% */ +/* kern_proc.c 3.8 %H% */ #include "../h/param.h" #include "../h/systm.h" @@ -12,7 +12,7 @@ #include "../h/inode.h" #include "../h/seg.h" #include "../h/acct.h" -#include +#include "/usr/include/wait.h" #include "../h/pte.h" #include "../h/vm.h" #include "../h/text.h" @@ -99,7 +99,8 @@ exece() if ((nc&BMASK) == 0) { if (bp) bdwrite(bp); - bp = getblk(swapdev, (daddr_t)(dbtofsb(swplo+bno)+(nc>>BSHIFT))); + bp = getblk(swapdev, + (daddr_t)(dbtofsb(swplo+bno)+(nc>>BSHIFT))); cp = bp->b_un.b_addr; } nc++; @@ -253,7 +254,8 @@ register struct inode *ip; ds = clrnd(btoc((u.u_exdata.ux_dsize+u.u_exdata.ux_bsize))); ss = clrnd(SSIZE + btoc(nargc)); if (overlay) { - if ((u.u_procp->p_flag & SPAGI) || u.u_sep==0 && ctos(ts) != ctos(u.u_tsize) || nargc) { + if ((u.u_procp->p_flag & SPAGI) || + u.u_sep==0 && ctos(ts) != ctos(u.u_tsize) || nargc) { u.u_error = ENOMEM; goto bad; } @@ -493,13 +495,27 @@ done: q->p_ppid = 1; wakeup((caddr_t)&proc[1]); /* - * Stopped or traced processes are killed + * Traced processes are killed * since their existence means someone is screwing up. + * Traced processes are sent a hangup and a continue. + * This is designed to be ``safe'' for setuid + * processes since they must be willing to tolerate + * hangups anyways. */ - if (q->p_stat == SSTOP || q->p_flag&STRC) { + if (q->p_flag&STRC) { q->p_flag &= ~STRC; psignal(q, SIGKILL); + } else if (q->p_stat == SSTOP) { + psignal(q, SIGHUP); + psignal(q, SIGCONT); } + /* + * Protect this process from future + * tty signals, and clear TSTP/TTIN/TTOU if pending. + */ + q->p_pgrp = 0; +#define bit(a) (1<<(a-1)) + q->p_sig &= ~(bit(SIGTSTP)|bit(SIGTTIN)|bit(SIGTTOU)); } wakeup((caddr_t)p->p_pptr); psignal(p->p_pptr, SIGCHLD);