Module Name:    src
Committed By:   christos
Date:           Sun Mar 27 16:23:08 UTC 2022

Modified Files:
        src/sys/fs/unionfs: unionfs_vnops.c
        src/sys/kern: kern_auth.c sysv_ipc.c
        src/sys/miscfs/genfs: genfs_vnops.c

Log Message:
Expose groupmember as kauth_cred_groupmember and use it.


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/fs/unionfs/unionfs_vnops.c
cvs rdiff -u -r1.79 -r1.80 src/sys/kern/kern_auth.c
cvs rdiff -u -r1.41 -r1.42 src/sys/kern/sysv_ipc.c
cvs rdiff -u -r1.217 -r1.218 src/sys/miscfs/genfs/genfs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/unionfs/unionfs_vnops.c
diff -u src/sys/fs/unionfs/unionfs_vnops.c:1.17 src/sys/fs/unionfs/unionfs_vnops.c:1.18
--- src/sys/fs/unionfs/unionfs_vnops.c:1.17	Tue Oct 19 23:08:17 2021
+++ src/sys/fs/unionfs/unionfs_vnops.c	Sun Mar 27 12:23:08 2022
@@ -566,7 +566,6 @@ unionfs_close_abort:
 static int
 unionfs_check_corrected_access(u_short mode, struct vattr *va, kauth_cred_t cred)
 {
-	int		result;
 	int		error;
 	uid_t		uid;	/* upper side vnode's uid */
 	gid_t		gid;	/* upper side vnode's gid */
@@ -590,10 +589,7 @@ unionfs_check_corrected_access(u_short m
 	}
 
 	/* check group */
-	error = kauth_cred_ismember_gid(cred, gid, &result);
-	if (error != 0)
-		return error;
-	if (result) {
+	if (kauth_cred_groupmember(cred, gid) == 0) {
 		if (mode & VEXEC)
 			mask |= S_IXGRP;
 		if (mode & VREAD)

Index: src/sys/kern/kern_auth.c
diff -u src/sys/kern/kern_auth.c:1.79 src/sys/kern/kern_auth.c:1.80
--- src/sys/kern/kern_auth.c:1.79	Sat Mar 12 10:32:32 2022
+++ src/sys/kern/kern_auth.c	Sun Mar 27 12:23:08 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_auth.c,v 1.79 2022/03/12 15:32:32 riastradh Exp $ */
+/* $NetBSD: kern_auth.c,v 1.80 2022/03/27 16:23:08 christos Exp $ */
 
 /*-
  * Copyright (c) 2005, 2006 Elad Efrat <e...@netbsd.org>
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_auth.c,v 1.79 2022/03/12 15:32:32 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_auth.c,v 1.80 2022/03/27 16:23:08 christos Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -404,6 +404,25 @@ kauth_cred_ismember_gid(kauth_cred_t cre
 	return (0);
 }
 
+int
+kauth_cred_groupmember(kauth_cred_t cred, gid_t gid)
+{
+	int ismember, error;
+
+	KASSERT(cred != NULL);
+	KASSERT(cred != NOCRED);
+	KASSERT(cred != FSCRED);
+
+	error = kauth_cred_ismember_gid(cred, gid, &ismember);
+	if (error)
+		return error;
+
+	if (kauth_cred_getegid(cred) == gid || ismember)
+		return 0;
+
+	return -1;
+}
+
 u_int
 kauth_cred_ngroups(kauth_cred_t cred)
 {

Index: src/sys/kern/sysv_ipc.c
diff -u src/sys/kern/sysv_ipc.c:1.41 src/sys/kern/sysv_ipc.c:1.42
--- src/sys/kern/sysv_ipc.c:1.41	Thu Feb 20 19:26:22 2020
+++ src/sys/kern/sysv_ipc.c	Sun Mar 27 12:23:08 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysv_ipc.c,v 1.41 2020/02/21 00:26:22 joerg Exp $	*/
+/*	$NetBSD: sysv_ipc.c,v 1.42 2022/03/27 16:23:08 christos Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysv_ipc.c,v 1.41 2020/02/21 00:26:22 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysv_ipc.c,v 1.42 2022/03/27 16:23:08 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_sysv.h"
@@ -258,7 +258,6 @@ sysvipc_listener_cb(kauth_cred_t cred, k
     void *arg0, void *arg1, void *arg2, void *arg3)
 {
 	mode_t mask;
-	int ismember = 0;
 	struct ipc_perm *perm;
 	int mode;
 	enum kauth_system_req req;
@@ -290,10 +289,8 @@ sysvipc_listener_cb(kauth_cred_t cred, k
 		return ((perm->mode & mask) == mask ? KAUTH_RESULT_ALLOW : KAUTH_RESULT_DEFER /* EACCES */);
 	}
 
-	if (kauth_cred_getegid(cred) == perm->gid ||
-	    (kauth_cred_ismember_gid(cred, perm->gid, &ismember) == 0 && ismember) ||
-	    kauth_cred_getegid(cred) == perm->cgid ||
-	    (kauth_cred_ismember_gid(cred, perm->cgid, &ismember) == 0 && ismember)) {
+	if (kauth_cred_groupmember(cred, perm->gid) == 0 ||
+	    kauth_cred_groupmember(cred, perm->cgid) == 0) {
 		if (mode & IPC_R)
 			mask |= S_IRGRP;
 		if (mode & IPC_W)

Index: src/sys/miscfs/genfs/genfs_vnops.c
diff -u src/sys/miscfs/genfs/genfs_vnops.c:1.217 src/sys/miscfs/genfs/genfs_vnops.c:1.218
--- src/sys/miscfs/genfs/genfs_vnops.c:1.217	Sat Mar 19 09:52:45 2022
+++ src/sys/miscfs/genfs/genfs_vnops.c	Sun Mar 27 12:23:08 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_vnops.c,v 1.217 2022/03/19 13:52:45 hannken Exp $	*/
+/*	$NetBSD: genfs_vnops.c,v 1.218 2022/03/27 16:23:08 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.217 2022/03/19 13:52:45 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.218 2022/03/27 16:23:08 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -663,18 +663,6 @@ genfs_node_wrlocked(struct vnode *vp)
 	return rw_write_held(&gp->g_glock);
 }
 
-static int
-groupmember(gid_t gid, kauth_cred_t cred)
-{
-	int ismember;
-	int error = kauth_cred_ismember_gid(cred, gid, &ismember);
-	if (error)
-		return error;
-	if (kauth_cred_getegid(cred) == gid || ismember)
-		return 0;
-	return -1;
-}
-
 /*
  * Common filesystem object access control check routine.  Accepts a
  * vnode, cred, uid, gid, mode, acl, requested access mode.
@@ -712,7 +700,7 @@ genfs_can_access(vnode_t *vp, kauth_cred
 
 	/* Otherwise, check the groups (first match) */
 	/* Otherwise, check the groups. */
-	error = groupmember(file_gid, cred);
+	error = kauth_cred_groupmember(cred, file_gid);
 	if (error > 0)
 		return error;
 	if (error == 0) {
@@ -864,7 +852,7 @@ genfs_can_access_acl_posix1e(vnode_t *vp
 		struct acl_entry *ae = &acl->acl_entry[i];
 		switch (ae->ae_tag) {
 		case ACL_GROUP_OBJ:
-			error = groupmember(file_gid, cred);
+			error = kauth_cred_groupmember(cred, file_gid);
 			if (error > 0)
 				return error;
 			if (error)
@@ -885,7 +873,7 @@ genfs_can_access_acl_posix1e(vnode_t *vp
 			break;
 
 		case ACL_GROUP:
-			error = groupmember(ae->ae_id, cred);
+			error = kauth_cred_groupmember(cred, ae->ae_id);
 			if (error > 0)
 				return error;
 			if (error)
@@ -919,7 +907,7 @@ genfs_can_access_acl_posix1e(vnode_t *vp
 			struct acl_entry *ae = &acl->acl_entry[i];
 			switch (ae->ae_tag) {
 			case ACL_GROUP_OBJ:
-				error = groupmember(file_gid, cred);
+				error = kauth_cred_groupmember(cred, file_gid);
 				if (error > 0)
 					return error;
 				if (error)
@@ -935,7 +923,7 @@ genfs_can_access_acl_posix1e(vnode_t *vp
 				goto out;
 
 			case ACL_GROUP:
-				error = groupmember(ae->ae_id, cred);
+				error = kauth_cred_groupmember(cred, ae->ae_id);
 				if (error > 0)
 					return error;
 				if (error)
@@ -1053,14 +1041,14 @@ _acl_denies(const struct acl *aclp, int 
 				continue;
 			break;
 		case ACL_GROUP_OBJ:
-			error = groupmember(file_gid, cred);
+			error = kauth_cred_groupmember(cred, file_gid);
 			if (error > 0)
 				return error;
 			if (error != 0)
 				continue;
 			break;
 		case ACL_GROUP:
-			error = groupmember(ae->ae_id, cred);
+			error = kauth_cred_groupmember(cred, ae->ae_id);
 			if (error > 0)
 				return error;
 			if (error != 0)

Reply via email to