X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/86fd527faf688ed6074d754c09bc9a2f2801d067..4e6e38871c68cf8ddfa65c3f6a0d0b2f3a1b2caf:/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 06600e05b3..53cab4f7c7 100644 --- a/usr/src/sys/kern/kern_proc.c +++ b/usr/src/sys/kern/kern_proc.c @@ -1,4 +1,4 @@ -/* kern_proc.c 4.7 %G% */ +/* kern_proc.c 4.25 82/04/02 */ #include "../h/param.h" #include "../h/systm.h" @@ -49,26 +49,24 @@ exece() char cfname[DIRSIZ]; char cfarg[SHSIZE]; - if ((ip = namei(uchar, 0)) == NULL) + if ((ip = namei(uchar, 0, 1)) == NULL) return; - bno = 0; bp = 0; indir = 0; uid = u.u_uid; gid = u.u_gid; - if (ip->i_mode & ISUID) uid = ip->i_uid; if (ip->i_mode & ISGID) gid = ip->i_gid; again: - if(access(ip, IEXEC)) + if (access(ip, IEXEC)) goto bad; - if((u.u_procp->p_flag&STRC) && access(ip, IREAD)) + if ((u.u_procp->p_flag&STRC) && access(ip, IREAD)) goto bad; - if((ip->i_mode & IFMT) != IFREG || + if ((ip->i_mode & IFMT) != IFREG || (ip->i_mode & (IEXEC|(IEXEC>>3)|(IEXEC>>6))) == 0) { u.u_error = EACCES; goto bad; @@ -94,10 +92,10 @@ exece() u.u_segflg = 1; readi(ip); u.u_segflg = 0; - if(u.u_error) + if (u.u_error) goto bad; - if (u.u_count > sizeof(u.u_exdata) - sizeof(u.u_exdata.Ux_A) - && u.u_exdata.ux_shell[0] != '#') { + if (u.u_count > sizeof(u.u_exdata) - sizeof(u.u_exdata.Ux_A) && + u.u_exdata.ux_shell[0] != '#') { u.u_error = ENOEXEC; goto bad; } @@ -156,7 +154,7 @@ exece() bcopy((caddr_t)u.u_dbuf, (caddr_t)cfname, DIRSIZ); indir = 1; iput(ip); - ip = namei(schar, 0); + ip = namei(schar, 0, 1); if (ip == NULL) return; goto again; @@ -169,18 +167,15 @@ exece() ne = 0; nc = 0; uap = (struct execa *)u.u_ap; - if ((bno = malloc(argmap, ctod(clrnd((int) btoc(NCARGS))))) == 0) { + if ((bno = rmalloc(argmap, ctod(clrnd((int) btoc(NCARGS))))) == 0) { swkill(u.u_procp, "exece"); goto bad; } if (bno % CLSIZE) - panic("execa malloc"); + panic("execa rmalloc"); if (uap->argp) for (;;) { ap = NULL; - if (na == 1 && indir) { - if (sharg == NULL) - ap = (int)uap->fname; - } else if (na == 2 && indir && sharg != NULL) + if (indir && (na == 1 || na == 2 && sharg)) ap = (int)uap->fname; else if (uap->argp) { ap = fuword((caddr_t)uap->argp); @@ -196,7 +191,7 @@ exece() if (ap==NULL) break; na++; - if(ap == -1) + if (ap == -1) u.u_error = EFAULT; do { if (nc >= NCARGS-1) @@ -244,7 +239,6 @@ badarg: /* * copy back arglist */ - ucp = USRSTACK - nc - NBPW; ap = ucp - na*NBPW - 3*NBPW; u.u_ar0[SP] = ap; @@ -280,7 +274,7 @@ bad: if (bp) brelse(bp); if (bno) - mfree(argmap, ctod(clrnd((int) btoc(NCARGS))), bno); + rmfree(argmap, ctod(clrnd((int) btoc(NCARGS))), bno); iput(ip); } @@ -297,28 +291,32 @@ register struct inode *ip; pagi = SPAGI; else pagi = 0; - - if(u.u_exdata.ux_tsize!=0 && (ip->i_flag&ITEXT)==0 && ip->i_count!=1) { + if (u.u_exdata.ux_tsize!=0 && (ip->i_flag&ITEXT)==0 && + ip->i_count!=1) { register struct file *fp; - for (fp = file; fp < fileNFILE; fp++) + for (fp = file; fp < fileNFILE; fp++) { + if (fp->f_flag & FSOCKET) + continue; if (fp->f_inode == ip && (fp->f_flag&FWRITE)) { u.u_error = ETXTBSY; goto bad; } + } } /* - * find text and data sizes - * try them out for possible - * exceed of max sizes + * Compute text and data sizes and make sure not too large. */ - 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 (chksize(ts, ds, ss)) goto bad; + + /* + * Make sure enough space to start process. + */ u.u_cdmap = zdmap; u.u_csmap = zdmap; if (swpexpand(ds, ss, &u.u_cdmap, &u.u_csmap) == NULL) @@ -343,7 +341,7 @@ register struct inode *ip; 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 &= ~(SPAGI|SSEQL|SUANOM|SNUSIG); u.u_procp->p_flag |= pagi; u.u_dmap = u.u_cdmap; u.u_smap = u.u_csmap; @@ -371,14 +369,10 @@ register struct inode *ip; * set SUID/SGID protections, if no tracing */ if ((u.u_procp->p_flag&STRC)==0) { -#ifndef MELB - if(u.u_uid != 0) -#endif - { - u.u_uid = uid; - u.u_procp->p_uid = uid; - } + u.u_uid = uid; + u.u_procp->p_uid = uid; u.u_gid = gid; + u.u_grps[gid/(sizeof(int)*8)] |= 1 << (gid%(sizeof(int)*8)); } else psignal(u.u_procp, SIGTRAP); u.u_tsize = ts; @@ -395,12 +389,9 @@ setregs() { register int (**rp)(); register i; -#ifdef UCBIPC - register struct port *pt; -#endif UCBIPC long sigmask; - for(rp = &u.u_signal[0], sigmask = 1L; rp < &u.u_signal[NSIG]; + for (rp = &u.u_signal[1], sigmask = 1L; rp < &u.u_signal[NSIG]; sigmask <<= 1, rp++) { switch (*rp) { @@ -418,7 +409,7 @@ setregs() if ((int)*rp & 1) u.u_procp->p_siga0 |= sigmask; else - u.u_procp->p_siga1 &= ~sigmask; + u.u_procp->p_siga0 &= ~sigmask; if ((int)*rp & 2) u.u_procp->p_siga1 |= sigmask; else @@ -428,30 +419,18 @@ setregs() } } /* - for(rp = &u.u_ar0[0]; rp < &u.u_ar0[16];) + for (rp = &u.u_ar0[0]; rp < &u.u_ar0[16];) *rp++ = 0; */ u.u_ar0[PC] = u.u_exdata.ux_entloc + 2; /* skip over entry mask */ - for(i=0; ipt_count == 0) - ptclose(pt); - u.u_pofile[i] &= ~ISPORT; - u.u_oport[i] = NULL; - } else { - closef(u.u_ofile[i]); - u.u_ofile[i] = NULL; - } -#endif UCBIPC u.u_pofile[i] &= ~EXCLOSE; } } + /* * Remember file name for accounting. */ @@ -460,8 +439,7 @@ setregs() } /* - * exit system call: - * pass back caller's arg + * Exit system call: pass back caller's arg */ rexit() { @@ -485,9 +463,6 @@ exit(rv) register int i; register struct proc *p, *q; register struct file *f; -#ifdef UCBIPC - register struct port *pt; -#endif UCBIPC register int x; #ifdef PGINPROF @@ -509,7 +484,7 @@ exit(rv) (void) spl0(); p->p_cpticks = 0; p->p_pctcpu = 0; - for(i=0; ip_flag &= ~SVFDONE; } - for(i=0; ipt_count == 0) - ptclose(pt); - u.u_oport[i] = NULL; - } else { - f = u.u_ofile[i]; - u.u_ofile[i] = NULL; - closef(f); - } -#endif UCBIPC + closef(f, 1); } - plock(u.u_cdir); + ilock(u.u_cdir); iput(u.u_cdir); if (u.u_rdir) { - plock(u.u_rdir); + ilock(u.u_rdir); iput(u.u_rdir); } u.u_limit[LIM_FSIZE] = INFINITY; acct(); vrelpt(u.u_procp); vrelu(u.u_procp, 0); + (void) spl5(); /* hack for mem alloc race XXX */ multprog--; -/* spl7(); /* clock will get mad because of overlaying */ p->p_stat = SZOMB; noproc = 1; i = PIDHASH(p->p_pid); @@ -575,8 +537,8 @@ done: ((struct xproc *)p)->xp_xstat = rv; /* overlay */ ((struct xproc *)p)->xp_vm = u.u_vm; /* overlay */ vmsadd(&((struct xproc *)p)->xp_vm, &u.u_cvm); - for(q = proc; q < procNPROC; q++) - if(q->p_pptr == p) { + for (q = proc; q < procNPROC; q++) + if (q->p_pptr == p) { q->p_pptr = &proc[1]; q->p_ppid = 1; wakeup((caddr_t)&proc[1]); @@ -597,13 +559,12 @@ done: } /* * Protect this process from future - * tty signals, clear TSTP/TTIN/TTOU if pending, - * and set SDETACH bit on procs. + * tty signals, clear TSTP/TTIN/TTOU if pending. */ (void) spgrp(q, -1); } - wakeup((caddr_t)p->p_pptr); psignal(p->p_pptr, SIGCHLD); + wakeup((caddr_t)p->p_pptr); swtch(); } @@ -639,10 +600,10 @@ wait1(options, vp) f = 0; loop: - for(p = proc; p < procNPROC; p++) - if(p->p_pptr == u.u_procp) { + for (p = proc; p < procNPROC; p++) + if (p->p_pptr == u.u_procp) { f++; - if(p->p_stat == SZOMB) { + if (p->p_stat == SZOMB) { u.u_r.r_val1 = p->p_pid; u.u_r.r_val2 = ((struct xproc *)p)->xp_xstat; ((struct xproc *)p)->xp_xstat = 0; @@ -709,7 +670,7 @@ fork1(isvfork) a = 0; p2 = NULL; - for(p1 = proc; p1 < procNPROC; p1++) { + for (p1 = proc; p1 < procNPROC; p1++) { if (p1->p_stat==NULL && p2==NULL) p2 = p1; else { @@ -723,6 +684,8 @@ fork1(isvfork) * not su and too many procs owned; or * not su and would take last slot. */ + if (p2==NULL) + tablefull("proc"); if (p2==NULL || (u.u_uid!=0 && (p2==procNPROC-1 || a>MAXUPRC))) { u.u_error = EAGAIN; if (!isvfork) { @@ -732,7 +695,7 @@ fork1(isvfork) goto out; } p1 = u.u_procp; - if(newproc(isvfork)) { + if (newproc(isvfork)) { u.u_r.r_val1 = p1->p_pid; u.u_r.r_val2 = 1; /* child */ u.u_start = time;