bug fixes from elz and utcsrgv!thomson
[unix-history] / usr / src / sys / kern / kern_proc.c
index 9cc5a4b..53cab4f 100644 (file)
@@ -1,4 +1,4 @@
-/*     kern_proc.c     4.14    81/11/16        */
+/*     kern_proc.c     4.25    82/04/02        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -49,7 +49,7 @@ exece()
        char cfname[DIRSIZ];
        char cfarg[SHSIZE];
 
        char cfname[DIRSIZ];
        char cfarg[SHSIZE];
 
-       if ((ip = namei(uchar, 0)) == NULL)
+       if ((ip = namei(uchar, 0, 1)) == NULL)
                return;
        bno = 0;
        bp = 0;
                return;
        bno = 0;
        bp = 0;
@@ -94,8 +94,8 @@ exece()
        u.u_segflg = 0;
        if (u.u_error)
                goto bad;
        u.u_segflg = 0;
        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;
        }
                u.u_error = ENOEXEC;
                goto bad;
        }
@@ -154,7 +154,7 @@ exece()
                bcopy((caddr_t)u.u_dbuf, (caddr_t)cfname, DIRSIZ);
                indir = 1;
                iput(ip);
                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;
                if (ip == NULL)
                        return;
                goto again;
@@ -372,6 +372,7 @@ register struct inode *ip;
                u.u_uid = uid;
                u.u_procp->p_uid = uid;
                u.u_gid = gid;
                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;
        } else
                psignal(u.u_procp, SIGTRAP);
        u.u_tsize = ts;
@@ -390,7 +391,7 @@ setregs()
        register i;
        long sigmask;
 
        register i;
        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) {
 
            sigmask <<= 1, rp++) {
                switch (*rp) {
 
@@ -408,7 +409,7 @@ setregs()
                        if ((int)*rp & 1)
                                u.u_procp->p_siga0 |= sigmask;
                        else
                        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
                        if ((int)*rp & 2)
                                u.u_procp->p_siga1 |= sigmask;
                        else
@@ -424,7 +425,7 @@ setregs()
        u.u_ar0[PC] = u.u_exdata.ux_entloc + 2; /* skip over entry mask */
        for (i=0; i<NOFILE; i++) {
                if (u.u_pofile[i]&EXCLOSE) {
        u.u_ar0[PC] = u.u_exdata.ux_entloc + 2; /* skip over entry mask */
        for (i=0; i<NOFILE; i++) {
                if (u.u_pofile[i]&EXCLOSE) {
-                       closef(u.u_ofile[i]);
+                       closef(u.u_ofile[i], 1);
                        u.u_ofile[i] = NULL;
                        u.u_pofile[i] &= ~EXCLOSE;
                }
                        u.u_ofile[i] = NULL;
                        u.u_pofile[i] &= ~EXCLOSE;
                }
@@ -502,7 +503,7 @@ exit(rv)
        for (i=0; i<NOFILE; i++) {
                f = u.u_ofile[i];
                u.u_ofile[i] = NULL;
        for (i=0; i<NOFILE; i++) {
                f = u.u_ofile[i];
                u.u_ofile[i] = NULL;
-               closef(f);
+               closef(f, 1);
        }
        ilock(u.u_cdir);
        iput(u.u_cdir);
        }
        ilock(u.u_cdir);
        iput(u.u_cdir);
@@ -514,6 +515,7 @@ exit(rv)
        acct();
        vrelpt(u.u_procp);
        vrelu(u.u_procp, 0);
        acct();
        vrelpt(u.u_procp);
        vrelu(u.u_procp, 0);
+       (void) spl5();          /* hack for mem alloc race XXX */
        multprog--;
        p->p_stat = SZOMB;
        noproc = 1;
        multprog--;
        p->p_stat = SZOMB;
        noproc = 1;
@@ -557,13 +559,12 @@ done:
                        }
                        /*
                         * Protect this process from future
                        }
                        /*
                         * 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);
                }
                         */
                        (void) spgrp(q, -1);
                }
-       wakeup((caddr_t)p->p_pptr);
        psignal(p->p_pptr, SIGCHLD);
        psignal(p->p_pptr, SIGCHLD);
+       wakeup((caddr_t)p->p_pptr);
        swtch();
 }
 
        swtch();
 }