POSIX.1-2003: Changing the group ID is permitted to a process with an
authorDavid Rhodus <drhodus@dragonflybsd.org>
Mon, 26 Jul 2004 19:48:31 +0000 (19:48 +0000)
committerDavid Rhodus <drhodus@dragonflybsd.org>
Mon, 26 Jul 2004 19:48:31 +0000 (19:48 +0000)
effective user ID of file, but without appropriate privileges, if and
only if owner is equal to the file's user ID or (uid_t)-1 and group is
equal either to the calling process effective group ID or to one of its
supplementary group IDs.

sys/vfs/ufs/ufs_vnops.c

index 78f73e3..64e0431 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)ufs_vnops.c 8.27 (Berkeley) 5/27/95
  * $FreeBSD: src/sys/ufs/ufs/ufs_vnops.c,v 1.131.2.8 2003/01/02 17:26:19 bde Exp $
- * $DragonFly: src/sys/vfs/ufs/ufs_vnops.c,v 1.14 2004/07/18 19:43:48 drhodus Exp $
+ * $DragonFly: src/sys/vfs/ufs/ufs_vnops.c,v 1.15 2004/07/26 19:48:31 drhodus Exp $
  */
 
 #include "opt_quota.h"
@@ -579,7 +579,8 @@ ufs_chown(struct vnode *vp, uid_t uid, gid_t gid, struct ucred *cred,
         * the caller must be superuser or the call fails.
         */
        if ((cred->cr_uid != ip->i_uid || uid != ip->i_uid ||
-           (gid != ip->i_gid && !groupmember((gid_t)gid, cred))) &&
+           (gid != ip->i_gid && !(cred->cr_gid == gid ||
+           groupmember((gid_t)gid, cred)))) &&
            (error = suser_cred(cred, PRISON_ROOT)))
                return (error);
        ogid = ip->i_gid;