new groups stuff
authorBill Joy <root@ucbvax.Berkeley.EDU>
Wed, 25 Aug 1982 06:06:33 +0000 (22:06 -0800)
committerBill Joy <root@ucbvax.Berkeley.EDU>
Wed, 25 Aug 1982 06:06:33 +0000 (22:06 -0800)
SCCS-vsn: sys/kern/init_main.c 4.35
SCCS-vsn: sys/kern/kern_proc.c 4.35
SCCS-vsn: sys/kern/kern_prot.c 5.4
SCCS-vsn: sys/kern/vfs_vnops.c 4.27
SCCS-vsn: sys/kern/vfs_lookup.c 4.24
SCCS-vsn: sys/ufs/ffs/ufs_lookup.c 4.24
SCCS-vsn: sys/ufs/ufs/ufs_lookup.c 4.24
SCCS-vsn: sys/kern/vfs_syscalls.c 4.35
SCCS-vsn: sys/ufs/ffs/ffs_vnops.c 4.35
SCCS-vsn: sys/ufs/ffs/ufs_vnops.c 4.35
SCCS-vsn: sys/ufs/lfs/lfs_vnops.c 4.35
SCCS-vsn: sys/ufs/ufs/ufs_vnops.c 4.35

12 files changed:
usr/src/sys/kern/init_main.c
usr/src/sys/kern/kern_proc.c
usr/src/sys/kern/kern_prot.c
usr/src/sys/kern/vfs_lookup.c
usr/src/sys/kern/vfs_syscalls.c
usr/src/sys/kern/vfs_vnops.c
usr/src/sys/ufs/ffs/ffs_vnops.c
usr/src/sys/ufs/ffs/ufs_lookup.c
usr/src/sys/ufs/ffs/ufs_vnops.c
usr/src/sys/ufs/lfs/lfs_vnops.c
usr/src/sys/ufs/ufs/ufs_lookup.c
usr/src/sys/ufs/ufs/ufs_vnops.c

index 9d5a979..d282c8e 100644 (file)
@@ -1,4 +1,4 @@
-/*     init_main.c     4.34    82/08/22        */
+/*     init_main.c     4.35    82/08/24        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -65,6 +65,8 @@ main(firstaddr)
        setredzone(p->p_addr, (caddr_t)&u);
        u.u_procp = p;
        u.u_cmask = CMASK;
        setredzone(p->p_addr, (caddr_t)&u);
        u.u_procp = p;
        u.u_cmask = CMASK;
+       for (i = 1; i < NGROUPS; i++)
+               u.u_groups[i] = -1;
        for (i = 1; i < sizeof(u.u_limit)/sizeof(u.u_limit[0]); i++)
                switch (i) {
 
        for (i = 1; i < sizeof(u.u_limit)/sizeof(u.u_limit[0]); i++)
                switch (i) {
 
index dc1a150..aa04972 100644 (file)
@@ -1,4 +1,4 @@
-/*     kern_proc.c     4.34    82/08/22        */
+/*     kern_proc.c     4.35    82/08/24        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -377,7 +377,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));
+               entergroup(gid);
        } else
                psignal(u.u_procp, SIGTRAP);
        u.u_tsize = ts;
        } else
                psignal(u.u_procp, SIGTRAP);
        u.u_tsize = ts;
index d8113e2..d6972e0 100644 (file)
@@ -1,11 +1,9 @@
-/*     kern_prot.c     5.3     82/07/24        */
+/*     kern_prot.c     5.4     82/08/24        */
 
 /*
  * System calls related to processes and protection
  */
 
 
 /*
  * System calls related to processes and protection
  */
 
-/* NEED ALLOCATION AND PROTECTION MECHANISM FOR PROCESS GROUPS */
-
 #include "../h/param.h"
 #include "../h/systm.h"
 #include "../h/dir.h"
 #include "../h/param.h"
 #include "../h/systm.h"
 #include "../h/dir.h"
@@ -62,17 +60,28 @@ getgid()
        u.u_r.r_val2 = u.u_gid;
 }
 
        u.u_r.r_val2 = u.u_gid;
 }
 
-getgrp()
+getgroups()
 {
        register struct a {
 {
        register struct a {
+               int     gidsetsize;
                int     *gidset;
        } *uap = (struct a *)u.u_ap;
                int     *gidset;
        } *uap = (struct a *)u.u_ap;
+       register int *gp;
 
 
-       if (copyout((caddr_t)u.u_grps, (caddr_t)uap->gidset,
-           sizeof (u.u_grps))) {
+       for (gp = &u.u_groups[NGROUPS]; gp > u.u_groups; gp--)
+               if (gp[-1] >= 0)
+                       break;
+       if (uap->gidsetsize < gp - u.u_groups) {
+               u.u_error = EINVAL;
+               return;
+       }
+       uap->gidsetsize = gp - u.u_groups;
+       if (copyout((caddr_t)u.u_groups, (caddr_t)uap->gidset,
+           uap->gidsetsize * sizeof (u.u_groups[0]))) {
                u.u_error = EFAULT;
                return;
        }
                u.u_error = EFAULT;
                return;
        }
+       u.u_r.r_val1 = uap->gidsetsize;
 }
 
 setpgrp()
 }
 
 setpgrp()
@@ -90,6 +99,7 @@ setpgrp()
                u.u_error = ESRCH;
                return;
        }
                u.u_error = ESRCH;
                return;
        }
+/* need better control mechanisms for process groups */
        if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) {
                u.u_error = EPERM;
                return;
        if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) {
                u.u_error = EPERM;
                return;
@@ -129,49 +139,34 @@ setgid()
        uap = (struct a *)u.u_ap;
        gid = uap->gid;
        if (u.u_rgid == gid || u.u_gid == gid || suser()) {
        uap = (struct a *)u.u_ap;
        gid = uap->gid;
        if (u.u_rgid == gid || u.u_gid == gid || suser()) {
+               leavegroup(u.u_gid); leavegroup(u.u_rgid);
+               (void) entergroup(gid);
                u.u_gid = gid;
                u.u_rgid = gid;
        }
 }
 
                u.u_gid = gid;
                u.u_rgid = gid;
        }
 }
 
-setgrp()
+setgroups()
 {
        register struct a {
 {
        register struct a {
+               int     gidsetsize;
                int     *gidset;
        } *uap = (struct a *)u.u_ap;
                int     *gidset;
        } *uap = (struct a *)u.u_ap;
+       register int *gp;
 
        if (suser())
                return;
 
        if (suser())
                return;
-       if (copyin((caddr_t)uap->gidset, (caddr_t)u.u_grps,
-           sizeof (u.u_grps))) {
-               u.u_error = EFAULT;
-               return;
-       }
-}
-
-/* BEGIN DEFUNCT */
-osetgrp()
-{
-       register struct a {
-               int *ngrps;
-               int *ogrps;
-       } *uap = (struct a *)u.u_ap;
-       int thegroups[NGRPS/(sizeof(int)*8)];
-
-       if (uap->ogrps && copyout((caddr_t)u.u_grps, (caddr_t)uap->ogrps,
-           sizeof (thegroups))) {
-               u.u_error = EFAULT;
+       if (uap->gidsetsize > sizeof (u.u_groups) / sizeof (u.u_groups[0])) {
+               u.u_error = EINVAL;
                return;
        }
                return;
        }
-       if (uap->ngrps == 0)
-               return;
-       if (copyin((caddr_t)uap->ngrps, (caddr_t)thegroups,
-           sizeof (thegroups))) {
+       if (copyin((caddr_t)uap->gidset, (caddr_t)u.u_groups,
+           uap->gidsetsize * sizeof (u.u_groups[0]))) {
                u.u_error = EFAULT;
                return;
        }
                u.u_error = EFAULT;
                return;
        }
-       if (suser())
-               bcopy((caddr_t)thegroups, (caddr_t)u.u_grps, sizeof (u.u_grps));
+       for (gp = &u.u_groups[uap->gidsetsize]; gp < &u.u_groups[NGROUPS]; gp++)
+               *gp = -1;
 }
 
 /*
 }
 
 /*
@@ -208,3 +203,34 @@ osetpgrp()
        p->p_pgrp = uap->pgrp;
 }
 /* END DEFUNCT */
        p->p_pgrp = uap->pgrp;
 }
 /* END DEFUNCT */
+
+leavegroup(gid)
+       int gid;
+{
+       register int *gp;
+
+       for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
+               if (*gp == gid)
+                       goto found;
+       return;
+found:
+       for (; gp < &u.u_groups[NGROUPS-1]; gp++)
+               *gp = *(gp+1);
+       *gp = 0;
+}
+
+entergroup(gid)
+       int gid;
+{
+       register int *gp;
+
+       for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
+               if (*gp == gid)
+                       return (0);
+       for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
+               if (*gp < 0) {
+                       *gp = gid;
+                       return (0);
+               }
+       return (-1);
+}
index e8e47e2..b0e54c9 100644 (file)
@@ -1,4 +1,4 @@
-/*     vfs_lookup.c    4.23    82/08/22        */
+/*     vfs_lookup.c    4.24    82/08/24        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
index 90b07c9..612d983 100644 (file)
@@ -1,4 +1,4 @@
-/*     vfs_syscalls.c  4.34    82/08/22        */
+/*     vfs_syscalls.c  4.35    82/08/24        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -579,13 +579,17 @@ chmod1(ip, mode)
        register struct inode *ip;
        register int mode;
 {
        register struct inode *ip;
        register int mode;
 {
+       register int *gp;
+
        ip->i_mode &= ~07777;
        if (u.u_uid) {
                mode &= ~ISVTX;
        ip->i_mode &= ~07777;
        if (u.u_uid) {
                mode &= ~ISVTX;
-               if (ip->i_gid >= NGRPS ||
-                   (u.u_grps[ip->i_gid/(sizeof(int)*8)] &
-                    (1 << ip->i_gid%(sizeof(int)*8))) == 0)
-                       mode &= ~ISGID;
+               for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
+                       if (*gp == ip->i_gid)
+                               goto ok;
+               mode &= ~ISGID;
+ok:
+               ;
 #ifdef MUSH
                if (u.u_quota->q_syflags & QF_UMASK && u.u_uid != 0 &&
                    (ip->i_mode & IFMT) != IFCHR)
 #ifdef MUSH
                if (u.u_quota->q_syflags & QF_UMASK && u.u_uid != 0 &&
                    (ip->i_mode & IFMT) != IFCHR)
index d6eae21..896904f 100644 (file)
@@ -1,4 +1,4 @@
-/*     vfs_vnops.c     4.26    82/08/03        */
+/*     vfs_vnops.c     4.27    82/08/24        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -65,6 +65,7 @@ access(ip, mode)
        int mode;
 {
        register m;
        int mode;
 {
        register m;
+       register int *gp;
 
        m = mode;
        if (m == IWRITE) {
 
        m = mode;
        if (m == IWRITE) {
@@ -83,10 +84,12 @@ access(ip, mode)
                return (0);
        if (u.u_uid != ip->i_uid) {
                m >>= 3;
                return (0);
        if (u.u_uid != ip->i_uid) {
                m >>= 3;
-               if (ip->i_gid >= NGRPS ||
-                   (u.u_grps[ip->i_gid/(sizeof(int)*8)] &
-                    (1 << ip->i_gid%(sizeof(int)*8)) == 0))
-                       m >>= 3;
+               for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
+                       if (ip->i_gid != *gp)
+                               goto found;
+               m >>= 3;
+found:
+               ;
        }
        if ((ip->i_mode&m) != 0)
                return (0);
        }
        if ((ip->i_mode&m) != 0)
                return (0);
index f854304..da6abd4 100644 (file)
@@ -1,4 +1,4 @@
-/*     ffs_vnops.c     4.34    82/08/22        */
+/*     ffs_vnops.c     4.35    82/08/24        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -579,13 +579,17 @@ chmod1(ip, mode)
        register struct inode *ip;
        register int mode;
 {
        register struct inode *ip;
        register int mode;
 {
+       register int *gp;
+
        ip->i_mode &= ~07777;
        if (u.u_uid) {
                mode &= ~ISVTX;
        ip->i_mode &= ~07777;
        if (u.u_uid) {
                mode &= ~ISVTX;
-               if (ip->i_gid >= NGRPS ||
-                   (u.u_grps[ip->i_gid/(sizeof(int)*8)] &
-                    (1 << ip->i_gid%(sizeof(int)*8))) == 0)
-                       mode &= ~ISGID;
+               for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
+                       if (*gp == ip->i_gid)
+                               goto ok;
+               mode &= ~ISGID;
+ok:
+               ;
 #ifdef MUSH
                if (u.u_quota->q_syflags & QF_UMASK && u.u_uid != 0 &&
                    (ip->i_mode & IFMT) != IFCHR)
 #ifdef MUSH
                if (u.u_quota->q_syflags & QF_UMASK && u.u_uid != 0 &&
                    (ip->i_mode & IFMT) != IFCHR)
index dfc2dd7..435a9bf 100644 (file)
@@ -1,4 +1,4 @@
-/*     ufs_lookup.c    4.23    82/08/22        */
+/*     ufs_lookup.c    4.24    82/08/24        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
index 1ab683a..b053461 100644 (file)
@@ -1,4 +1,4 @@
-/*     ufs_vnops.c     4.34    82/08/22        */
+/*     ufs_vnops.c     4.35    82/08/24        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -579,13 +579,17 @@ chmod1(ip, mode)
        register struct inode *ip;
        register int mode;
 {
        register struct inode *ip;
        register int mode;
 {
+       register int *gp;
+
        ip->i_mode &= ~07777;
        if (u.u_uid) {
                mode &= ~ISVTX;
        ip->i_mode &= ~07777;
        if (u.u_uid) {
                mode &= ~ISVTX;
-               if (ip->i_gid >= NGRPS ||
-                   (u.u_grps[ip->i_gid/(sizeof(int)*8)] &
-                    (1 << ip->i_gid%(sizeof(int)*8))) == 0)
-                       mode &= ~ISGID;
+               for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
+                       if (*gp == ip->i_gid)
+                               goto ok;
+               mode &= ~ISGID;
+ok:
+               ;
 #ifdef MUSH
                if (u.u_quota->q_syflags & QF_UMASK && u.u_uid != 0 &&
                    (ip->i_mode & IFMT) != IFCHR)
 #ifdef MUSH
                if (u.u_quota->q_syflags & QF_UMASK && u.u_uid != 0 &&
                    (ip->i_mode & IFMT) != IFCHR)
index 65f7a93..096d232 100644 (file)
@@ -1,4 +1,4 @@
-/*     lfs_vnops.c     4.34    82/08/22        */
+/*     lfs_vnops.c     4.35    82/08/24        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -579,13 +579,17 @@ chmod1(ip, mode)
        register struct inode *ip;
        register int mode;
 {
        register struct inode *ip;
        register int mode;
 {
+       register int *gp;
+
        ip->i_mode &= ~07777;
        if (u.u_uid) {
                mode &= ~ISVTX;
        ip->i_mode &= ~07777;
        if (u.u_uid) {
                mode &= ~ISVTX;
-               if (ip->i_gid >= NGRPS ||
-                   (u.u_grps[ip->i_gid/(sizeof(int)*8)] &
-                    (1 << ip->i_gid%(sizeof(int)*8))) == 0)
-                       mode &= ~ISGID;
+               for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
+                       if (*gp == ip->i_gid)
+                               goto ok;
+               mode &= ~ISGID;
+ok:
+               ;
 #ifdef MUSH
                if (u.u_quota->q_syflags & QF_UMASK && u.u_uid != 0 &&
                    (ip->i_mode & IFMT) != IFCHR)
 #ifdef MUSH
                if (u.u_quota->q_syflags & QF_UMASK && u.u_uid != 0 &&
                    (ip->i_mode & IFMT) != IFCHR)
index dfc2dd7..435a9bf 100644 (file)
@@ -1,4 +1,4 @@
-/*     ufs_lookup.c    4.23    82/08/22        */
+/*     ufs_lookup.c    4.24    82/08/24        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
index 1ab683a..b053461 100644 (file)
@@ -1,4 +1,4 @@
-/*     ufs_vnops.c     4.34    82/08/22        */
+/*     ufs_vnops.c     4.35    82/08/24        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -579,13 +579,17 @@ chmod1(ip, mode)
        register struct inode *ip;
        register int mode;
 {
        register struct inode *ip;
        register int mode;
 {
+       register int *gp;
+
        ip->i_mode &= ~07777;
        if (u.u_uid) {
                mode &= ~ISVTX;
        ip->i_mode &= ~07777;
        if (u.u_uid) {
                mode &= ~ISVTX;
-               if (ip->i_gid >= NGRPS ||
-                   (u.u_grps[ip->i_gid/(sizeof(int)*8)] &
-                    (1 << ip->i_gid%(sizeof(int)*8))) == 0)
-                       mode &= ~ISGID;
+               for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
+                       if (*gp == ip->i_gid)
+                               goto ok;
+               mode &= ~ISGID;
+ok:
+               ;
 #ifdef MUSH
                if (u.u_quota->q_syflags & QF_UMASK && u.u_uid != 0 &&
                    (ip->i_mode & IFMT) != IFCHR)
 #ifdef MUSH
                if (u.u_quota->q_syflags & QF_UMASK && u.u_uid != 0 &&
                    (ip->i_mode & IFMT) != IFCHR)