PERFORCE change 113505 for review

Todd Miller millert at FreeBSD.org
Thu Jan 25 15:04:30 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=113505

Change 113505 by millert at millert_macbook on 2007/01/25 15:03:29

	Pass in a struct componentname * to some more vfs entrypoints
	where it is available.  We could add more if we are willing
	to move some nameidone() calls in the vendor sources.

Affected files ...

.. //depot/projects/trustedbsd/sedarwin8/darwin/xnu/bsd/vfs/vfs_attrlist.c#6 edit
.. //depot/projects/trustedbsd/sedarwin8/darwin/xnu/bsd/vfs/vfs_syscalls.c#22 edit
.. //depot/projects/trustedbsd/sedarwin8/darwin/xnu/security/mac_framework.h#39 edit
.. //depot/projects/trustedbsd/sedarwin8/darwin/xnu/security/mac_policy.h#47 edit
.. //depot/projects/trustedbsd/sedarwin8/darwin/xnu/security/mac_vfs.c#26 edit
.. //depot/projects/trustedbsd/sedarwin8/policies/sedarwin/sedarwin/sebsd.c#78 edit

Differences ...

==== //depot/projects/trustedbsd/sedarwin8/darwin/xnu/bsd/vfs/vfs_attrlist.c#6 (text+ko) ====

@@ -697,15 +697,15 @@
 		 */
 		if (perms & W_OK)
 			if (mac_vnode_check_access(vfs_context_ucred(ctx),
-			    vp, W_OK) != 0)
+			    vp, cnp, W_OK) != 0)
 				perms &= ~W_OK;
 		if (perms & R_OK)
 			if (mac_vnode_check_access(vfs_context_ucred(ctx),
-			    vp, R_OK) != 0)
+			    vp, cnp, R_OK) != 0)
 				perms &= ~R_OK;
 		if (perms & X_OK)
 			if (mac_vnode_check_access(vfs_context_ucred(ctx),
-			     vp, X_OK) != 0)
+			     vp, cnp, X_OK) != 0)
 				perms &= ~X_OK;
 #endif /* MAC */
 		KAUTH_DEBUG("ATTRLIST - returning user access %x", perms);
@@ -1195,15 +1195,15 @@
 		 */
 		if (perms & W_OK)
 			if (mac_vnode_check_access(vfs_context_ucred(&context),
-			    vp, W_OK) != 0)
+			    vp, cnp, W_OK) != 0)
 				perms &= ~W_OK;
 		if (perms & R_OK)
 			if (mac_vnode_check_access(vfs_context_ucred(&context),
-			    vp, R_OK) != 0)
+			    vp, cnp, R_OK) != 0)
 				perms &= ~R_OK;
 		if (perms & X_OK)
 			if (mac_vnode_check_access(vfs_context_ucred(&context),
-			    vp, X_OK) != 0)
+			    vp, cnp, X_OK) != 0)
 				perms &= ~X_OK;
 #endif /* MAC */
 		VFS_DEBUG(ctx, vp, "ATTRLIST - granting perms %d", perms);

==== //depot/projects/trustedbsd/sedarwin8/darwin/xnu/bsd/vfs/vfs_syscalls.c#22 (text+ko) ====

@@ -376,7 +376,7 @@
 	}
 #ifdef MAC
 	error = mac_mount_check_mount(vfs_context_ucred(&context), vp,
-	    vfsp->vfc_name);
+	    &nd.ni_cnd, vfsp->vfc_name);
 	if (error != 0)
 		goto out1;
 #endif
@@ -1608,7 +1608,8 @@
 		return (error);
 
 #ifdef MAC
-	error = mac_vnode_check_chroot(vfs_context_ucred(&context), nd.ni_vp);
+	error = mac_vnode_check_chroot(vfs_context_ucred(&context), nd.ni_vp,
+	    &nd.ni_cnd);
 	if (error) {
 		vnode_put(nd.ni_vp);
 		return (error);
@@ -2540,7 +2541,8 @@
  * Check access permissions.
  */
 static int
-access1(vnode_t vp, vnode_t dvp, int uflags, vfs_context_t ctx)
+access1(vnode_t vp, vnode_t dvp, struct component *cnp, int uflags,
+    vfs_context_t ctx)
 {
  	kauth_action_t action;
 	int error;
@@ -2575,7 +2577,7 @@
 	}
 	
 #ifdef MAC
-	error = mac_vnode_check_access(vfs_context_ucred(ctx), vp, uflags);
+	error = mac_vnode_check_access(vfs_context_ucred(ctx), vp, cnp, uflags);
 	if (error)
 		return (error);
 #endif /* MAC */
@@ -2727,7 +2729,8 @@
 			break;
 		case 0:
 			/* run this access check */
-			result[i] = access1(vp, dvp, input[i].ad_flags, &context);
+			result[i] = access1(vp, dvp, NULL, input[i].ad_flags,
+			    &context);
 			break;
 		default:
 			/* fatal lookup error */
@@ -2779,7 +2782,7 @@
  	if (error)
  		goto out;
 
-	error = access1(nd.ni_vp, nd.ni_dvp, uap->flags, &context);
+	error = access1(nd.ni_vp, nd.ni_dvp, &nd.ni_cnd, uap->flags, &context);
  	
  	vnode_put(nd.ni_vp);
  	if (uap->flags & _DELETE_OK)

==== //depot/projects/trustedbsd/sedarwin8/darwin/xnu/security/mac_framework.h#39 (text+ko) ====

@@ -204,7 +204,7 @@
 	    struct vfs_attr *vfa);
 int	mac_mount_check_label_update(struct ucred *cred, struct mount *mp);
 int	mac_mount_check_mount(struct ucred *cred, struct vnode *vp,
-	    const char *vfc_name);
+	    struct componentname *cnp, const char *vfc_name);
 int	mac_mount_check_remount(struct ucred *cred, struct mount *mp);
 int	mac_mount_check_setattr(struct ucred *cred, struct mount *mp,
 	    struct vfs_attr *vfa);
@@ -368,9 +368,10 @@
 int	mac_task_check_get_port(struct ucred *cred, struct task *task);
 void	mac_thread_userret(int code, int error, struct thread *thread);
 int	mac_vnode_check_access(struct ucred *cred, struct vnode *vp,
-	    int acc_mode);
+	    struct componentname *cnp, int acc_mode);
 int	mac_vnode_check_chdir(struct ucred *cred, struct vnode *dvp);
-int	mac_vnode_check_chroot(struct ucred *cred, struct vnode *dvp);
+int	mac_vnode_check_chroot(struct ucred *cred, struct vnode *dvp,
+	    struct componentname *cnp);
 int	mac_vnode_check_create(struct ucred *cred, struct vnode *dvp,
 	    struct componentname *cnp, struct vnode_attr *vap);
 int	mac_vnode_check_deleteextattr(struct ucred *cred, struct vnode *vp,

==== //depot/projects/trustedbsd/sedarwin8/darwin/xnu/security/mac_policy.h#47 (text+ko) ====

@@ -1619,6 +1619,7 @@
   @param cred Subject credential
   @param vp Vnode that is to be the mount point
   @param vlabel Label associated with the vnode
+  @param cnp Component name for vp
   @param vfc_name Filesystem type name
 
   Determine whether the subject identified by the credential can perform
@@ -1631,6 +1632,7 @@
 	struct ucred *cred,
 	struct vnode *vp,
 	struct label *vlabel,
+	struct componentname *cnp,
 	const char *vfc_name
 );
 /**
@@ -4391,6 +4393,7 @@
   @param cred Subject credential
   @param vp Object vnode
   @param label Label for vp
+  @param cnp Component name for vp
   @param acc_mode access(2) flags
 
   Determine how invocations of access(2) and related calls by the
@@ -4407,6 +4410,7 @@
 	struct ucred *cred,
 	struct vnode *vp,
 	struct label *label,
+	struct componentname *cnp,
 	int acc_mode
 );
 /**
@@ -4432,6 +4436,7 @@
   @param cred Subject credential
   @param dvp Directory vnode
   @param dlabel Policy label associated with dvp
+  @param cnp Component name for dvp
 
   Determine whether the subject identified by the credential should be
   allowed to chroot(2) into the specified directory (dvp).
@@ -4442,7 +4447,8 @@
 typedef int mpo_vnode_check_chroot_t(
 	struct ucred *cred,
 	struct vnode *dvp,
-	struct label *dlabel
+	struct label *dlabel,
+	struct componentname *cnp
 );
 /**
   @brief Access control check for creating vnode

==== //depot/projects/trustedbsd/sedarwin8/darwin/xnu/security/mac_vfs.c#26 (text+ko) ====

@@ -379,13 +379,14 @@
 }
 
 int
-mac_vnode_check_access(struct ucred *cred, struct vnode *vp, int acc_mode)
+mac_vnode_check_access(struct ucred *cred, struct vnode *vp,
+    struct componentname *cnp, int acc_mode)
 {
 	int error, mask;
 
 	/* Convert {R,W,X}_OK values to V{READ,WRITE,EXEC} for entry points */
 	mask = ACCESS_MODE_TO_VNODE_MASK(acc_mode);
-	MAC_CHECK(vnode_check_access, cred, vp, vp->v_label, mask);
+	MAC_CHECK(vnode_check_access, cred, vp, vp->v_label, cnp, mask);
 	return (error);
 }
 
@@ -399,11 +400,12 @@
 }
 
 int
-mac_vnode_check_chroot(struct ucred *cred, struct vnode *dvp)
+mac_vnode_check_chroot(struct ucred *cred, struct vnode *dvp,
+    struct componentname *cnp)
 {
 	int error;
 
-	MAC_CHECK(vnode_check_chroot, cred, dvp, dvp->v_label);
+	MAC_CHECK(vnode_check_chroot, cred, dvp, dvp->v_label, cnp);
 	return (error);
 }
 
@@ -810,11 +812,12 @@
 }
 
 int
-mac_mount_check_mount(struct ucred *cred, struct vnode *vp, const char *vfc_name)
+mac_mount_check_mount(struct ucred *cred, struct vnode *vp,
+    struct componentname *cnp, const char *vfc_name)
 {
 	int error;
 
-	MAC_CHECK(mount_check_mount, cred, vp, vp->v_label, vfc_name);
+	MAC_CHECK(mount_check_mount, cred, vp, vp->v_label, cnp, vfc_name);
 
 	return (error);
 }

==== //depot/projects/trustedbsd/sedarwin8/policies/sedarwin/sedarwin/sebsd.c#78 (text+ko) ====

@@ -1454,7 +1454,7 @@
 
 static int
 sebsd_mount_check_mount(struct ucred *cred, struct vnode *vp, struct label *vl,
-    const char *vfc_name)
+    struct componentname *cnp, const char *vfc_name)
 {
 	int rc;
 	u_int32_t sid;
@@ -1465,7 +1465,7 @@
 	vsec = SLOT(vl);
 	task = SLOT(cred->cr_label);
 
-	rc = vnode_has_perm(cred, vp, NULL, FILE__MOUNTON);
+	rc = vnode_has_perm(cred, vp, cnp, FILE__MOUNTON);
 	if (rc)
 		goto done;
 
@@ -1906,14 +1906,14 @@
 
 static int
 sebsd_vnode_check_access(struct ucred *cred, struct vnode *vp,
-    struct label *filelabel, int mask)
+    struct label *filelabel, struct componentname *cnp, int mask)
 {
 
 	/* existence check (F_OK) */
 	if (mask == 0)
 		return (0);
 
-	return (vnode_has_perm(cred, vp, NULL,
+	return (vnode_has_perm(cred, vp, cnp,
 	    file_mask_to_av(vp->v_type, mask)));
 }
 
@@ -1928,12 +1928,12 @@
 
 static int
 sebsd_vnode_check_chroot(struct ucred *cred, struct vnode *dvp,
-    struct label *dlabel)
+    struct label *dlabel, struct componentname *cnp)
 {
 
 	/* TBD: Incomplete, SELinux also check capability(CAP_SYS_CHROOT)) */
 	/* MAY_EXEC ~= DIR__SEARCH */
-	return (vnode_has_perm(cred, dvp, NULL, DIR__SEARCH));
+	return (vnode_has_perm(cred, dvp, cnp, DIR__SEARCH));
 }
 
 static int


More information about the p4-projects mailing list