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:
-/* 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"
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) {
-/* 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"
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;
-/* 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"
u.u_r.r_val2 = u.u_gid;
}
u.u_r.r_val2 = u.u_gid;
}
int *gidset;
} *uap = (struct a *)u.u_ap;
int *gidset;
} *uap = (struct a *)u.u_ap;
- 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;
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;
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;
}
}
int *gidset;
} *uap = (struct a *)u.u_ap;
int *gidset;
} *uap = (struct a *)u.u_ap;
- 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;
- 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;
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);
+}
-/* 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"
-/* 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"
register struct inode *ip;
register int mode;
{
register struct inode *ip;
register int mode;
{
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)
-/* 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"
m = mode;
if (m == IWRITE) {
m = mode;
if (m == IWRITE) {
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);
-/* 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"
register struct inode *ip;
register int mode;
{
register struct inode *ip;
register int mode;
{
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)
-/* 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"
-/* 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"
register struct inode *ip;
register int mode;
{
register struct inode *ip;
register int mode;
{
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)
-/* 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"
register struct inode *ip;
register int mode;
{
register struct inode *ip;
register int mode;
{
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)
-/* 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"
-/* 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"
register struct inode *ip;
register int mode;
{
register struct inode *ip;
register int mode;
{
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)