X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/8643403fcca8dfc555514e7ca5ae392a0d8d476e..dd808ba377b1ac57ce3e95ddf5991912c61e38d8:/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 81a4de2757..56f9909d1c 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.8 %H% */ +/* kern_proc.c 3.25 %G% */ #include "../h/param.h" #include "../h/systm.h" @@ -17,6 +17,8 @@ #include "../h/vm.h" #include "../h/text.h" #include "../h/psl.h" +#include "../h/vlimit.h" +#include "../h/file.h" /* * exec system call, with and without environments. @@ -61,7 +63,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,8 +101,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++; @@ -111,10 +113,11 @@ exece() bdwrite(bp); bp = 0; nc = (nc + NBPW-1) & ~(NBPW-1); - if (getxfile(ip, nc) || u.u_error) { + getxfile(ip, nc + (na+4)*NBPW); + if (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); @@ -145,7 +148,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; @@ -161,33 +165,26 @@ 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); } /* * Read in and set up memory for executed file. - * Zero return is normal; - * non-zero means only the text is being replaced */ getxfile(ip, nargc) register struct inode *ip; { - register sep; register size_t ts, ds, ss; - register int overlay; int pagi = 0; /* * read in first few bytes * of file for segment * sizes: - * ux_mag = 407/410/411/405 + * ux_mag = 407/410/413 * 407 is plain executable * 410 is RO text - * 411 is separated ID - * 405 is overlaid text - * 412 is demand paged plain executable (NOT IMPLEMENTED) * 413 is demand paged RO text */ @@ -203,18 +200,8 @@ register struct inode *ip; u.u_error = ENOEXEC; goto bad; } - sep = 0; - overlay = 0; switch (u.u_exdata.ux_mag) { - case 0405: - overlay++; - break; - - case 0412: - u.u_error = ENOEXEC; - goto bad; - case 0407: u.u_exdata.ux_dsize += u.u_exdata.ux_tsize; u.u_exdata.ux_tsize = 0; @@ -231,17 +218,18 @@ register struct inode *ip; } break; - case 0411: - u.u_error = ENOEXEC; - goto bad; - default: u.u_error = ENOEXEC; goto bad; } if(u.u_exdata.ux_tsize!=0 && (ip->i_flag&ITEXT)==0 && ip->i_count!=1) { - u.u_error = ETXTBSY; - goto bad; + register struct file *fp; + + for (fp = file; fp < &file[NFILE]; fp++) + if (fp->f_inode == ip && (fp->f_flag&FWRITE)) { + u.u_error = ETXTBSY; + goto bad; + } } /* @@ -253,89 +241,74 @@ register struct inode *ip; ts = clrnd(btoc(u.u_exdata.ux_tsize)); 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) { - u.u_error = ENOMEM; - goto bad; - } - ds = u.u_dsize; - ss = u.u_ssize; - sep = u.u_sep; - xfree(); - xalloc(ip, pagi); - u.u_ar0[PC] = u.u_exdata.ux_entloc + 2; /* skip over entry mask */ - } else { - if (chksize(ts, ds, ss)) - goto bad; - u.u_cdmap = zdmap; - u.u_csmap = zdmap; - if (swpexpand(ds, ss, &u.u_cdmap, &u.u_csmap) == NULL) - goto bad; - - /* - * At this point, committed to the new image! - * Release virtual memory resources of old process, and - * initialize the virtual memory of the new process. - * If we resulted from vfork(), instead wakeup our - * parent who will set SVFDONE when he has taken back - * our resources. - */ - u.u_prof.pr_scale = 0; - if ((u.u_procp->p_flag & SVFORK) == 0) - vrelvm(); - else { - u.u_procp->p_flag &= ~SVFORK; - u.u_procp->p_flag |= SKEEP; - wakeup((caddr_t)u.u_procp); - while ((u.u_procp->p_flag & SVFDONE) == 0) - sleep((caddr_t)u.u_procp, PZERO - 1); - u.u_procp->p_flag &= ~(SVFDONE|SKEEP); - } - u.u_procp->p_flag &= ~(SPAGI|SANOM|SUANOM); - u.u_procp->p_flag |= pagi; - u.u_dmap = u.u_cdmap; - u.u_smap = u.u_csmap; - vgetvm(ts, ds, ss); - - if (pagi == 0) { - /* - * Read in data segment. - */ - u.u_base = (char *)ctob(ts); - u.u_offset = sizeof(u.u_exdata)+u.u_exdata.ux_tsize; - u.u_count = u.u_exdata.ux_dsize; - readi(ip); - } - xalloc(ip, pagi); - if (pagi && u.u_procp->p_textp) - vinifod((struct fpte *)dptopte(u.u_procp, 0), - PG_FTEXT, u.u_procp->p_textp->x_iptr, - 1 + ts/CLSIZE, (int)btoc(u.u_exdata.ux_dsize)); + if (chksize(ts, ds, ss)) + goto bad; + u.u_cdmap = zdmap; + u.u_csmap = zdmap; + if (swpexpand(ds, ss, &u.u_cdmap, &u.u_csmap) == NULL) + goto bad; - /* THIS SHOULD BE DONE AT A LOWER LEVEL, IF AT ALL */ - mtpr(TBIA,1); + /* + * At this point, committed to the new image! + * Release virtual memory resources of old process, and + * initialize the virtual memory of the new process. + * If we resulted from vfork(), instead wakeup our + * parent who will set SVFDONE when he has taken back + * our resources. + */ + u.u_prof.pr_scale = 0; + if ((u.u_procp->p_flag & SVFORK) == 0) + vrelvm(); + else { + u.u_procp->p_flag &= ~SVFORK; + u.u_procp->p_flag |= SKEEP; + wakeup((caddr_t)u.u_procp); + while ((u.u_procp->p_flag & SVFDONE) == 0) + sleep((caddr_t)u.u_procp, PZERO - 1); + u.u_procp->p_flag &= ~(SVFDONE|SKEEP); + } + u.u_procp->p_flag &= ~(SPAGI|SANOM|SUANOM|SNUSIG); + u.u_procp->p_flag |= pagi; + u.u_dmap = u.u_cdmap; + u.u_smap = u.u_csmap; + vgetvm(ts, ds, ss); + if (pagi == 0) { /* - * set SUID/SGID protections, if no tracing + * Read in data segment. */ - if ((u.u_procp->p_flag&STRC)==0) { - if(ip->i_mode&ISUID) - if(u.u_uid != 0) { - u.u_uid = ip->i_uid; - u.u_procp->p_uid = ip->i_uid; - } - if(ip->i_mode&ISGID) - u.u_gid = ip->i_gid; - } else - psignal(u.u_procp, SIGTRAP); + u.u_base = (char *)ctob(ts); + u.u_offset = sizeof(u.u_exdata)+u.u_exdata.ux_tsize; + u.u_count = u.u_exdata.ux_dsize; + readi(ip); } + xalloc(ip, pagi); + if (pagi && u.u_procp->p_textp) + vinifod((struct fpte *)dptopte(u.u_procp, 0), + PG_FTEXT, u.u_procp->p_textp->x_iptr, + 1 + ts/CLSIZE, (int)btoc(u.u_exdata.ux_dsize)); + + /* THIS SHOULD BE DONE AT A LOWER LEVEL, IF AT ALL */ + mtpr(TBIA, 0); + + /* + * set SUID/SGID protections, if no tracing + */ + if ((u.u_procp->p_flag&STRC)==0) { + if(ip->i_mode&ISUID) + if(u.u_uid != 0) { + u.u_uid = ip->i_uid; + u.u_procp->p_uid = ip->i_uid; + } + if(ip->i_mode&ISGID) + u.u_gid = ip->i_gid; + } else + psignal(u.u_procp, SIGTRAP); u.u_tsize = ts; u.u_dsize = ds; u.u_ssize = ss; - u.u_sep = sep; bad: - return(overlay); + return; } /* @@ -438,8 +411,8 @@ exit(rv) else p->p_siga1 = 0; (void) spl0(); - rate.v_pgin -= p->p_aveflt; - p->p_aveflt = 0; + p->p_cpticks = 0; + p->p_pctcpu = 0; for(i=0; ip_stat = SZOMB; + noproc = 1; i = PIDHASH(p->p_pid); x = p - proc; if (pidhash[i] == x) @@ -497,7 +472,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. @@ -511,11 +486,10 @@ done: } /* * Protect this process from future - * tty signals, and clear TSTP/TTIN/TTOU if pending. + * tty signals, clear TSTP/TTIN/TTOU if pending, + * and set SDETACH bit on procs. */ - q->p_pgrp = 0; -#define bit(a) (1<<(a-1)) - q->p_sig &= ~(bit(SIGTSTP)|bit(SIGTTIN)|bit(SIGTTOU)); + spgrp(q, -1); } wakeup((caddr_t)p->p_pptr); psignal(p->p_pptr, SIGCHLD); @@ -594,12 +568,10 @@ loop: u.u_r.r_val1 = 0; return; } -/* - if (setjmp(u.u_qsav)) { + if ((u.u_procp->p_flag&SNUSIG) && setjmp(u.u_qsav)) { u.u_eosys = RESTARTSYS; return; } -*/ sleep((caddr_t)u.u_procp, PWAIT); goto loop; } @@ -684,6 +656,10 @@ sbreak() if (n < 0) n = 0; d = clrnd(n - u.u_dsize); + if (ctob(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)