X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/0dde1c43fc3a789427aaa762ce87419981643e82..c7a40c31f514a4d8e79a3f43d46161023e4f5435:/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 16ab0018d3..1b752ace76 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.7 %H% */ +/* kern_proc.c 3.16 %G% */ #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" @@ -61,7 +61,7 @@ exece() ne = 0; nc = 0; uap = (struct execa *)u.u_ap; - if ((bno = malloc(swapmap, ctod(clrnd((int) btoc(NCARGS))))) == 0) { + if ((bno = malloc(argmap, ctod(clrnd((int) btoc(NCARGS))))) == 0) { swkill(u.u_procp, "exece"); goto bad; } @@ -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(argdev, + (daddr_t)(dbtofsb(bno)+(nc>>BSHIFT))); cp = bp->b_un.b_addr; } nc++; @@ -113,7 +114,7 @@ exece() if (getxfile(ip, nc) || u.u_error) { badarg: for (c = 0; c < nc; c += BSIZE) - if (bp = baddr(swapdev, dbtofsb(swplo+bno)+(c>>BSHIFT))) { + if (bp = baddr(argdev, dbtofsb(bno)+(c>>BSHIFT))) { bp->b_flags |= B_AGE; /* throw away */ bp->b_flags &= ~B_DELWRI; /* cancel io */ brelse(bp); @@ -144,7 +145,8 @@ badarg: if ((nc&BMASK) == 0) { if (bp) brelse(bp); - bp = bread(swapdev, (daddr_t)(dbtofsb(swplo+bno)+(nc>>BSHIFT))); + bp = bread(argdev, + (daddr_t)(dbtofsb(bno)+(nc>>BSHIFT))); bp->b_flags |= B_AGE; /* throw away */ bp->b_flags &= ~B_DELWRI; /* cancel io */ cp = bp->b_un.b_addr; @@ -160,7 +162,7 @@ bad: if (bp) brelse(bp); if (bno) - mfree(swapmap, ctod(clrnd((int) btoc(NCARGS))), bno); + mfree(argmap, ctod(clrnd((int) btoc(NCARGS))), bno); iput(ip); } @@ -253,7 +255,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; } @@ -312,7 +315,7 @@ register struct inode *ip; 1 + ts/CLSIZE, (int)btoc(u.u_exdata.ux_dsize)); /* THIS SHOULD BE DONE AT A LOWER LEVEL, IF AT ALL */ - mtpr(TBIA,1); + mtpr(TBIA, 0); /* * set SUID/SGID protections, if no tracing @@ -436,7 +439,6 @@ exit(rv) else p->p_siga1 = 0; (void) spl0(); - rate.v_pgin -= p->p_aveflt; p->p_aveflt = 0; for(i=0; ip_stat = SZOMB; i = PIDHASH(p->p_pid); x = p - proc; @@ -495,7 +499,7 @@ done: /* * Traced processes are killed * since their existence means someone is screwing up. - * Traced processes are sent a hangup and a continue. + * Stopped 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. @@ -506,13 +510,13 @@ done: } else if (q->p_stat == SSTOP) { psignal(q, SIGHUP); psignal(q, SIGCONT); - /* - * Protect this process from future - * tty signals, and clear TSTP if pending. - */ - q->p_pgrp = 0; - q->p_sig &= ~(1<<(SIGTSTP-1)); } + /* + * Protect this process from future + * tty signals, clear TSTP/TTIN/TTOU if pending, + * and set SDETACH bit on procs. + */ + spgrp(q, -1); } wakeup((caddr_t)p->p_pptr); psignal(p->p_pptr, SIGCHLD); @@ -681,6 +685,10 @@ sbreak() if (n < 0) n = 0; d = clrnd(n - u.u_dsize); + if (u.u_dsize+d > u.u_limit[LIM_DATA]) { + u.u_error = ENOMEM; + return; + } if (chksize(u.u_tsize, u.u_dsize+d, u.u_ssize)) return; if (swpexpand(u.u_dsize+d, u.u_ssize, &u.u_dmap, &u.u_smap)==0)