changeset 7885:76e5e2554169

Re: [fmac-discuss] [PATCH] Move link/setattr hooks into filesystem code On Thu, 2008-10-16 at 23:18 -0700, John Weeks wrote: > On 10/16/08 07:48, Stephen Smalley wrote: > > Move the remaining FMAC permission checking hooks (link, setattr) from > > the fop layer into the filesystem code for consistency with the other > > permission checking hooks. This also allows fmac_vnode_link() to occur > > after the VOP_REALVP call by the filesystem code and thus not need to > > separately invoke it. The fmac_vnode_link() hook is required in order > > to check link permission to the target file. The fmac_vnode_setattr() > > hook is required in order to ensure that setattr permission to the > > target file is always checked, as the existing zfs access checks can be > > overridden by the various secpolicy hooks called by zfs_setattr(). This > > might be later obsoleted by the integration of FMAC and privileges. > > > > Webrev at: http://cr.opensolaris.org/~sds/linksetattr/ > > Acked-by: John Weeks <john.weeks@sun.com> > > Please resolve cstyle issue before pushing. Revised patch to fix all cstyle issues reported by cstyle -cpP on all files modified by this patch.
author Stephen Smalley <sds@tycho.nsa.gov>
date Fri, 17 Oct 2008 13:28:26 -0400
parents 711c35fb7932
children 2b3705cc2d65
files usr/src/uts/common/fmac/fmac.c usr/src/uts/common/fs/tmpfs/tmp_vnops.c usr/src/uts/common/fs/vnode.c usr/src/uts/common/fs/zfs/zfs_vnops.c usr/src/uts/common/sys/fmac/fmac.h
diffstat 5 files changed, 28 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/fmac/fmac.c	Wed Oct 15 15:42:09 2008 -0400
+++ b/usr/src/uts/common/fmac/fmac.c	Fri Oct 17 13:28:26 2008 -0400
@@ -189,7 +189,7 @@
 
 	if (XVA_ISSET_RTN(&xvattr, XAT_SECCTX)) {
 		error = security_context_to_sid(xoap->xoa_secctx,
-			strlen(xoap->xoa_secctx), &secid);
+		    strlen(xoap->xoa_secctx), &secid);
 		if (error)
 			return (error);
 	} else {
@@ -377,7 +377,7 @@
 		xva_from_va(xvap, vap);
 		*vapp = &xvap->xva_vattr;
 	} else {
-		xvap = (xvattr_t *) vap;
+		xvap = (xvattr_t *)vap;
 	}
 
 	error = security_sid_to_context(secid, &scontext, &scontext_len);
@@ -409,13 +409,11 @@
 }
 
 int
-fmac_vnode_link(vnode_t *tdvp, vnode_t *svp, char *name, cred_t *cr,
-    caller_context_t *ct)
+fmac_vnode_link(vnode_t *tdvp, vnode_t *svp, char *name, cred_t *cr)
 {
 	security_id_t cr_secid;
 	security_class_t sclass;
 	int error;
-	vnode_t *realvp;
 	avc_audit_data_t ad;
 
 	if (!fmac_enabled)
@@ -425,9 +423,6 @@
 	if (!sclass)
 		return (0);
 
-	if (VOP_REALVP(svp, &realvp, ct) == 0)
-		svp = realvp;
-
 	cr_secid = crgetsecid(cr);
 
 	AVC_AUDIT_DATA_INIT(&ad, FS);
@@ -440,7 +435,7 @@
 
 	ad.u.fs.vp = svp;
 	return (avc_has_perm(cr_secid, svp->v_secid, sclass,
-		    FILE__LINK, &ad));
+	    FILE__LINK, &ad));
 }
 
 int
@@ -555,7 +550,7 @@
 	AVC_AUDIT_DATA_INIT(&ad, FS);
 	ad.u.fs.vp = vp;
 	return (avc_has_perm(cr_secid, vp->v_secid, sclass,
-		    FILE__SETATTR, &ad));
+	    FILE__SETATTR, &ad));
 }
 
 int
@@ -702,7 +697,7 @@
 	if (!fmac_enabled)
 		return (0);
 	return (avc_has_perm(crgetsecid((cred_t *)scr), crgetsecid(tcr),
-		    SECCLASS_PROCESS, PROCESS__PTRACE, NULL));
+	    SECCLASS_PROCESS, PROCESS__PTRACE, NULL));
 }
 
 access_vector_t
--- a/usr/src/uts/common/fs/tmpfs/tmp_vnops.c	Wed Oct 15 15:42:09 2008 -0400
+++ b/usr/src/uts/common/fs/tmpfs/tmp_vnops.c	Fri Oct 17 13:28:26 2008 -0400
@@ -748,6 +748,10 @@
 			return (EINVAL);
 	}
 
+	error = fmac_vnode_setattr(vp, cred);
+	if (error)
+		return (error);
+
 	mutex_enter(&tp->tn_tlock);
 
 	get = &tp->tn_attr;
@@ -1151,6 +1155,10 @@
 	if (VOP_REALVP(srcvp, &realvp, ct) == 0)
 		srcvp = realvp;
 
+	error = fmac_vnode_link(dvp, srcvp, tnm, cred);
+	if (error)
+		return (error);
+
 	parent = (struct tmpnode *)VTOTN(dvp);
 	from = (struct tmpnode *)VTOTN(srcvp);
 
--- a/usr/src/uts/common/fs/vnode.c	Wed Oct 15 15:42:09 2008 -0400
+++ b/usr/src/uts/common/fs/vnode.c	Fri Oct 17 13:28:26 2008 -0400
@@ -3287,10 +3287,6 @@
 		return (EINVAL);
 	}
 
-	err = fmac_vnode_setattr(vp, cr);
-	if (err)
-		return (err);
-
 	err = (*(vp)->v_op->vop_setattr)(vp, vap, flags, cr, ct);
 	VOPSTATS_UPDATE(vp, setattr);
 	return (err);
@@ -3453,10 +3449,6 @@
 
 	VOPXID_MAP_CR(tdvp, cr);
 
-	err = fmac_vnode_link(tdvp, svp, tnm, cr, ct);
-	if (err)
-		return (err);
-
 	err = (*(tdvp)->v_op->vop_link)(tdvp, svp, tnm, cr, ct, flags);
 	VOPSTATS_UPDATE(tdvp, link);
 	return (err);
@@ -4071,10 +4063,6 @@
 		return (EINVAL);
 	}
 
-	err = fmac_vnode_setattr(vp, cr);
-	if (err)
-		return (err);
-
 	err = (*(vp)->v_op->vop_setsecattr) (vp, vsap, flag, cr, ct);
 	VOPSTATS_UPDATE(vp, setsecattr);
 	return (err);
--- a/usr/src/uts/common/fs/zfs/zfs_vnops.c	Wed Oct 15 15:42:09 2008 -0400
+++ b/usr/src/uts/common/fs/zfs/zfs_vnops.c	Fri Oct 17 13:28:26 2008 -0400
@@ -2518,6 +2518,13 @@
 	 * First validate permissions
 	 */
 
+
+	err = fmac_vnode_setattr(vp, cr);
+	if (err) {
+		ZFS_EXIT(zfsvfs);
+		return (err);
+	}
+
 	if (mask & AT_SIZE) {
 		err = zfs_zaccess(zp, ACE_WRITE_DATA, 0, skipaclchk, cr);
 		if (err) {
@@ -3474,6 +3481,12 @@
 	if (VOP_REALVP(svp, &realvp, ct) == 0)
 		svp = realvp;
 
+	error = fmac_vnode_link(tdvp, svp, name, cr);
+	if (error) {
+		ZFS_EXIT(zfsvfs);
+		return (error);
+	}
+
 	if (svp->v_vfsp != tdvp->v_vfsp) {
 		ZFS_EXIT(zfsvfs);
 		return (EXDEV);
--- a/usr/src/uts/common/sys/fmac/fmac.h	Wed Oct 15 15:42:09 2008 -0400
+++ b/usr/src/uts/common/sys/fmac/fmac.h	Fri Oct 17 13:28:26 2008 -0400
@@ -93,8 +93,7 @@
 int fmac_vnode_create(vnode_t *, char *, xvattr_t *, vattr_t **, cred_t *,
     security_id_t *);
 void fmac_vnode_post_create(vnode_t *, security_id_t);
-int fmac_vnode_link(vnode_t *tdvp, vnode_t *svp, char *name, cred_t *cr,
-    caller_context_t *ct);
+int fmac_vnode_link(vnode_t *tdvp, vnode_t *svp, char *name, cred_t *cr);
 int fmac_vnode_remove(vnode_t *dvp, vnode_t *vp, char *name, cred_t *cr);
 int fmac_vnode_rename(vnode_t *sdvp, vnode_t *svp, vnode_t *tdvp, vnode_t *tvp,
     cred_t *cr);