PERFORCE change 26892 for review

Robert Watson rwatson at freebsd.org
Fri Mar 14 20:28:09 GMT 2003


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

Change 26892 by rwatson at rwatson_paprika on 2003/03/14 12:27:36

	First pass at restructuring handling of umask in the creation
	of new file system objects.  In order to permit the file
	system to override the umask, as done on Solaris and Linux
	with default ACLs, composition of the requested mode and
	mask must be done at the file system level.  Currently, it's
	done by the caller of the VOP; this set of changes adds
	cmask arguments to the vnode operations that involve creation:
	
		VOP_CREATE()
		VOP_MKNOD()
		VOP_MKDIR()
		VOP_SYMLINK()
	
	In addition, the the vn_open() and vn_open_cred() wrapper
	functions which may invoke VOP_CREATE().  All consumers of
	these interfaces have been updated to avoid local calculation
	of the resulting mode and instead to pass it in explicitly.
	
	Note all providers of these interfaces have been updated
	yet.  Unionfs required special handling because it cached
	a creation mode for new files; it now also caches the
	creation mask.
	
	Semantics are intended to be identical in the before and
	after case, since I haven't yet made modifications to UFS
	to use the ACL_MASK entry instead of the umask in the event
	there is a default ACL with a mask.
	
	Note that in some cases, errors in current logic are
	highlighted, including inconsistent use of ALLPERMS vs
	ACCESSPERMS, situations where the mask should have been
	applied but wasn't, and situtions where the locking of
	the p_fd structure is inconsistent (sometimes we lock it,
	sometimes we don't).

Affected files ...

.. //depot/projects/trustedbsd/acl/sys/coda/coda_vnops.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/dev/ccd/ccd.c#4 edit
.. //depot/projects/trustedbsd/acl/sys/dev/md/md.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/dev/raidframe/rf_freebsdkintf.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/fs/hpfs/hpfs_lookup.c#2 edit
.. //depot/projects/trustedbsd/acl/sys/fs/hpfs/hpfs_subr.h#2 edit
.. //depot/projects/trustedbsd/acl/sys/fs/hpfs/hpfs_vnops.c#4 edit
.. //depot/projects/trustedbsd/acl/sys/fs/msdosfs/msdosfs_vnops.c#4 edit
.. //depot/projects/trustedbsd/acl/sys/fs/nwfs/nwfs_vnops.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/fs/smbfs/smbfs_vnops.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/fs/unionfs/union.h#2 edit
.. //depot/projects/trustedbsd/acl/sys/fs/unionfs/union_subr.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/fs/unionfs/union_vfsops.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/fs/unionfs/union_vnops.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/gnu/ext2fs/ext2_vnops.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/kern/kern_acct.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/kern/kern_alq.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/kern/kern_descrip.c#4 edit
.. //depot/projects/trustedbsd/acl/sys/kern/kern_ktrace.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/kern/kern_linker.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/kern/kern_mac.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/kern/kern_sig.c#4 edit
.. //depot/projects/trustedbsd/acl/sys/kern/link_elf.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/kern/tty_cons.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/kern/uipc_usrreq.c#4 edit
.. //depot/projects/trustedbsd/acl/sys/kern/vfs_syscalls.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/kern/vfs_vnops.c#4 edit
.. //depot/projects/trustedbsd/acl/sys/kern/vnode_if.src#4 edit
.. //depot/projects/trustedbsd/acl/sys/nfsclient/nfs_lock.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/nfsclient/nfs_vnops.c#4 edit
.. //depot/projects/trustedbsd/acl/sys/nfsserver/nfs_serv.c#4 edit
.. //depot/projects/trustedbsd/acl/sys/security/mac_biba/mac_biba.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/security/mac_lomac/mac_lomac.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/security/mac_mls/mac_mls.c#3 edit
.. //depot/projects/trustedbsd/acl/sys/security/mac_none/mac_none.c#2 edit
.. //depot/projects/trustedbsd/acl/sys/security/mac_test/mac_test.c#2 edit
.. //depot/projects/trustedbsd/acl/sys/sys/mac.h#3 edit
.. //depot/projects/trustedbsd/acl/sys/sys/mac_policy.h#3 edit
.. //depot/projects/trustedbsd/acl/sys/sys/vnode.h#5 edit
.. //depot/projects/trustedbsd/acl/sys/ufs/ffs/ffs_snapshot.c#4 edit
.. //depot/projects/trustedbsd/acl/sys/ufs/ufs/ufs_quota.c#3 edit

Differences ...

==== //depot/projects/trustedbsd/acl/sys/coda/coda_vnops.c#3 (text+ko) ====

@@ -1132,6 +1132,7 @@
     struct vnode *dvp = ap->a_dvp;
     struct cnode *dcp = VTOC(dvp);
     struct vattr *va = ap->a_vap;
+    int cmask = ap->a_cmask;
     int exclusive = 1;
     int mode = ap->a_vap->va_mode;
     struct vnode **vpp = ap->a_vpp;
@@ -1151,6 +1152,8 @@
     /* All creates are exclusive XXX */
     /* I'm assuming the 'mode' argument is the file mode bits XXX */
 
+    mode ~= cmask;
+
     /* Check for create of control object. */
     if (IS_CTL_NAME(dvp, nm, len)) {
 	*vpp = (struct vnode *)0;

==== //depot/projects/trustedbsd/acl/sys/dev/ccd/ccd.c#4 (text+ko) ====

@@ -1208,7 +1208,7 @@
 
 	NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, path, td);
 	flags = FREAD | FWRITE;
-	if ((error = vn_open(&nd, &flags, 0)) != 0) {
+	if ((error = vn_open(&nd, &flags, 0, 0)) != 0) {
 		return (error);
 	}
 	vp = nd.ni_vp;

==== //depot/projects/trustedbsd/acl/sys/dev/md/md.c#3 (text+ko) ====

@@ -845,13 +845,13 @@
 
 	flags = FREAD|FWRITE;
 	NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, mdio->md_file, td);
-	error = vn_open(&nd, &flags, 0);
+	error = vn_open(&nd, &flags, 0, 0);
 	if (error) {
 		if (error != EACCES && error != EPERM && error != EROFS)
 			return (error);
 		flags &= ~FWRITE;
 		NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, mdio->md_file, td);
-		error = vn_open(&nd, &flags, 0);
+		error = vn_open(&nd, &flags, 0, 0);
 		if (error)
 			return (error);
 	}

==== //depot/projects/trustedbsd/acl/sys/dev/raidframe/rf_freebsdkintf.c#3 (text+ko) ====

@@ -1737,7 +1737,7 @@
 
 	NDINIT(nd, LOOKUP, FOLLOW, UIO_SYSSPACE, path, curthread);
 	flags = FREAD | FWRITE;
-	if ((error = vn_open(nd, &flags, 0)) != 0) {
+	if ((error = vn_open(nd, &flags, 0, 0)) != 0) {
 		rf_printf(2, "RAIDframe: vn_open returned %d\n", error);
 		goto end1;
 	}

==== //depot/projects/trustedbsd/acl/sys/fs/hpfs/hpfs_lookup.c#2 (text+ko) ====

@@ -112,7 +112,8 @@
 	struct vnode * dvp,
 	struct vnode ** vpp,
 	struct componentname *cnp,
-	struct vattr *vap)
+	struct vattr *vap
+	int cmask)
 {
 #ifdef HPFS_DEBUG
 	register struct hpfsnode *dhp = VTOHP(dvp);

==== //depot/projects/trustedbsd/acl/sys/fs/hpfs/hpfs_subr.h#2 (text+ko) ====

@@ -66,7 +66,7 @@
 				      struct buf **, struct hpfsdirent **);
 
 int		hpfs_makefnode (struct vnode *, struct vnode **,
-				struct componentname *, struct vattr *);
+				struct componentname *, struct vattr *, int);
 int		hpfs_removefnode (struct vnode *, struct vnode *,
 				struct componentname *);
 

==== //depot/projects/trustedbsd/acl/sys/fs/hpfs/hpfs_vnops.c#4 (text+ko) ====

@@ -1171,6 +1171,7 @@
 		struct vnode **a_vpp;
 		struct componentname *a_cnp;
 		struct vattr *a_vap;
+		int a_cmask;
 	} */ *ap;
 {
 	int error;
@@ -1181,7 +1182,8 @@
 	if (!(ap->a_cnp->cn_flags & HASBUF)) 
 		panic ("hpfs_create: no name\n");
 
-	error = hpfs_makefnode (ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap);
+	error = hpfs_makefnode (ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap,
+	    cmask);
 
 	return (error);
 }

==== //depot/projects/trustedbsd/acl/sys/fs/msdosfs/msdosfs_vnops.c#4 (text+ko) ====

@@ -133,6 +133,7 @@
 		struct vnode **a_vpp;
 		struct componentname *a_cnp;
 		struct vattr *a_vap;
+		int a_cmask;
 	} */ *ap;
 {
 	struct componentname *cnp = ap->a_cnp;
@@ -140,6 +141,7 @@
 	struct denode *dep;
 	struct denode *pdep = VTODE(ap->a_dvp);
 	struct timespec ts;
+	u_short mode
 	int error;
 
 #ifdef MSDOSFS_DEBUG
@@ -172,7 +174,11 @@
 	if (error)
 		goto bad;
 
-	ndirent.de_Attributes = (ap->a_vap->va_mode & VWRITE) ?
+	/*
+	 * XXXACL: bogus comparison?  Should be 0000200 (S_IWUSR).
+	 */
+	mode = ap->a_vap->va_mode &~ ap->a_cmask;
+	ndirent.de_Attributes = (mode & VWRITE) ?
 				ATTR_ARCHIVE : ATTR_ARCHIVE | ATTR_READONLY;
 	ndirent.de_LowerCase = 0;
 	ndirent.de_StartCluster = 0;

==== //depot/projects/trustedbsd/acl/sys/fs/nwfs/nwfs_vnops.c#3 (text+ko) ====

@@ -414,6 +414,7 @@
 		struct vnode **a_vpp;
 		struct componentname *a_cnp;
 		struct vattr *a_vap;
+		int a_cmask;
 	} */ *ap;
 {
 	struct vnode *dvp = ap->a_dvp;

==== //depot/projects/trustedbsd/acl/sys/fs/smbfs/smbfs_vnops.c#3 (text+ko) ====

@@ -521,6 +521,7 @@
 		struct vnode **a_vpp;
 		struct componentname *a_cnp;
 		struct vattr *a_vap;
+		int a_cmask;
 	} */ *ap;
 {
 	struct vnode *dvp = ap->a_dvp;

==== //depot/projects/trustedbsd/acl/sys/fs/unionfs/union.h#2 (text+ko) ====

@@ -46,7 +46,8 @@
 	struct vnode	*um_uppervp;	/* UN_ULOCK holds locking state */
 	struct vnode	*um_lowervp;	/* Left unlocked */
 	struct ucred	*um_cred;	/* Credentials of user calling mount */
-	int		um_cmode;	/* cmask from mount process */
+	int		um_cmode;	/* cmode from mount process */
+	int		um_cmask;	/* umask from mount process */
 	int		um_op;		/* Operation mode */
 };
 

==== //depot/projects/trustedbsd/acl/sys/fs/unionfs/union_subr.c#3 (text+ko) ====

@@ -959,7 +959,7 @@
 	/* VOP_LEASE: dvp is locked */
 	VOP_LEASE(dvp, td, cn.cn_cred, LEASE_WRITE);
 
-	error = VOP_MKDIR(dvp, vpp, &cn, &va);
+	error = VOP_MKDIR(dvp, vpp, &cn, &va, um->um_cmask);
 	if (cn.cn_flags & HASBUF) {
 		uma_zfree(namei_zone, cn.cn_pnbuf);
 		cn.cn_flags &= ~HASBUF;
@@ -1050,13 +1050,14 @@
 	struct vattr *vap = &vat;
 	int fmode = FFLAGS(O_WRONLY|O_CREAT|O_TRUNC|O_EXCL);
 	int error;
-	int cmode;
+	int cmode, cmask;
 	struct componentname cn;
 
 	*vpp = NULLVP;
 	FILEDESC_LOCK(td->td_proc->p_fd);
-	cmode = UN_FILEMODE & ~td->td_proc->p_fd->fd_cmask;
+	cmask = td->td_proc->p_fd->fd_cmask;
 	FILEDESC_UNLOCK(td->td_proc->p_fd);
+	cmode = UN_FILEMODE;
 
 	/*
 	 * Build a new componentname structure (for the same
@@ -1118,7 +1119,7 @@
 	vap->va_type = VREG;
 	vap->va_mode = cmode;
 	VOP_LEASE(un->un_dirvp, td, cred, LEASE_WRITE);
-	error = VOP_CREATE(un->un_dirvp, &vp, &cn, vap);
+	error = VOP_CREATE(un->un_dirvp, &vp, &cn, vap, cmask);
 	if (cn.cn_flags & HASBUF) {
 		uma_zfree(namei_zone, cn.cn_pnbuf);
 		cn.cn_flags &= ~HASBUF;

==== //depot/projects/trustedbsd/acl/sys/fs/unionfs/union_vfsops.c#3 (text+ko) ====

@@ -246,8 +246,9 @@
 
 	um->um_cred = crhold(td->td_ucred);
 	FILEDESC_LOCK(td->td_proc->p_fd);
-	um->um_cmode = UN_DIRMODE &~ td->td_proc->p_fd->fd_cmask;
+	um->um_cmask = td->td_proc->p_fd->fd_cmask;
 	FILEDESC_UNLOCK(td->td_proc->p_fd);
+	um->um_cmode = UN_DIRMODE;
 
 	/*
 	 * Depending on what you think the MNT_LOCAL flag might mean,

==== //depot/projects/trustedbsd/acl/sys/fs/unionfs/union_vnops.c#3 (text+ko) ====

@@ -631,6 +631,7 @@
 		struct vnode **a_vpp;
 		struct componentname *a_cnp;
 		struct vattr *a_vap;
+		int a_cmask;
 	} */ *ap;
 {
 	struct union_node *dun = VTOUNION(ap->a_dvp);
@@ -643,7 +644,7 @@
 		struct vnode *vp;
 		struct mount *mp;
 
-		error = VOP_CREATE(dvp, &vp, cnp, ap->a_vap);
+		error = VOP_CREATE(dvp, &vp, cnp, ap->a_vap, ap->a_cmask);
 		if (error == 0) {
 			mp = ap->a_dvp->v_mount;
 			VOP_UNLOCK(vp, 0, td);
@@ -699,7 +700,7 @@
 	int error = EROFS;
 
 	if ((dvp = union_lock_upper(dun, cnp->cn_thread)) != NULL) {
-		error = VOP_MKNOD(dvp, ap->a_vpp, cnp, ap->a_vap);
+		error = VOP_MKNOD(dvp, ap->a_vpp, cnp, ap->a_vap, ap->a_cmask);
 		union_unlock_upper(dvp, cnp->cn_thread);
 	}
 	return (error);
@@ -1473,6 +1474,7 @@
 		struct vnode **a_vpp;
 		struct componentname *a_cnp;
 		struct vattr *a_vap;
+		int a_cmask;
 	} */ *ap;
 {
 	struct union_node *dun = VTOUNION(ap->a_dvp);
@@ -1484,7 +1486,7 @@
 	if ((upperdvp = union_lock_upper(dun, td)) != NULLVP) {
 		struct vnode *vp;
 
-		error = VOP_MKDIR(upperdvp, &vp, cnp, ap->a_vap);
+		error = VOP_MKDIR(upperdvp, &vp, cnp, ap->a_vap, ap->a_cmask);
 		union_unlock_upper(upperdvp, td);
 
 		if (error == 0) {
@@ -1546,6 +1548,7 @@
 		struct componentname *a_cnp;
 		struct vattr *a_vap;
 		char *a_target;
+		int a_cmask;
 	} */ *ap;
 {
 	struct union_node *dun = VTOUNION(ap->a_dvp);
@@ -1556,7 +1559,7 @@
 
 	if ((dvp = union_lock_upper(dun, td)) != NULLVP) {
 		error = VOP_SYMLINK(dvp, ap->a_vpp, cnp, ap->a_vap,
-			    ap->a_target);
+			    ap->a_target, ap->a_cmask);
 		union_unlock_upper(dvp, td);
 	}
 	return (error);

==== //depot/projects/trustedbsd/acl/sys/gnu/ext2fs/ext2_vnops.c#3 (text+ko) ====

@@ -280,13 +280,16 @@
 		struct vnode **a_vpp;
 		struct componentname *a_cnp;
 		struct vattr *a_vap;
+		int a_cmask;
 	} */ *ap;
 {
+	u_short mode;
 	int error;
 
+	mode = ap->a_vap->va_mode &~ ap->a_cmask;
 	error =
-	    ext2_makeinode(MAKEIMODE(ap->a_vap->va_type, ap->a_vap->va_mode),
-	    ap->a_dvp, ap->a_vpp, ap->a_cnp);
+	    ext2_makeinode(MAKEIMODE(ap->a_vap->va_type, mode), ap->a_dvp,
+	    ap->a_vpp, ap->a_cnp);
 	if (error)
 		return (error);
 	return (0);

==== //depot/projects/trustedbsd/acl/sys/kern/kern_acct.c#3 (text+ko) ====

@@ -142,7 +142,7 @@
 	if (uap->path != NULL) {
 		NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td);
 		flags = FWRITE | O_APPEND;
-		error = vn_open(&nd, &flags, 0);
+		error = vn_open(&nd, &flags, 0, 0);
 		if (error)
 			goto done2;
 		NDFREE(&nd, NDF_ONLY_PNBUF);

==== //depot/projects/trustedbsd/acl/sys/kern/kern_alq.c#3 (text+ko) ====

@@ -334,7 +334,7 @@
 	struct ale *alp;
 	struct alq *alq;
 	char *bufp;
-	int flags;
+	int cmask, flags;
 	int error;
 	int i;
 
@@ -344,7 +344,13 @@
 	NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, file, td);
 	flags = FWRITE | O_NOFOLLOW | O_CREAT;
 
-	error = vn_open(&nd, &flags, 0);
+	/*
+	 * XXXACL: creation mask here?
+	 */
+	FILEDESC_LOCK(td->td_proc->p_fd);
+	cmask = td->td_proc->p_fd->fd_cmask;
+	FILEDESC_UNLOCK(td->td_proc->p_fd);
+	error = vn_open(&nd, &flags, ACCESSPERMS, cmask);
 	if (error)
 		return (error);
 	

==== //depot/projects/trustedbsd/acl/sys/kern/kern_descrip.c#4 (text+ko) ====

@@ -1588,7 +1588,7 @@
 			NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, "/dev/null",
 			    td);
 			flags = FREAD | FWRITE;
-			error = vn_open(&nd, &flags, 0);
+			error = vn_open(&nd, &flags, 0, 0);
 			if (error != 0) {
 				FILEDESC_LOCK(fdp);
 				fdp->fd_ofiles[fd] = NULL;

==== //depot/projects/trustedbsd/acl/sys/kern/kern_ktrace.c#3 (text+ko) ====

@@ -506,7 +506,7 @@
 		 */
 		NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->fname, td);
 		flags = FREAD | FWRITE | O_NOFOLLOW;
-		error = vn_open(&nd, &flags, 0);
+		error = vn_open(&nd, &flags, 0, 0);
 		if (error) {
 			td->td_inktrace = 0;
 			return (error);

==== //depot/projects/trustedbsd/acl/sys/kern/kern_linker.c#3 (text+ko) ====

@@ -1391,7 +1391,7 @@
 		 */
 		NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, result, td);
 		flags = FREAD;
-		error = vn_open(&nd, &flags, 0);
+		error = vn_open(&nd, &flags, 0, 0);
 		if (error == 0) {
 			NDFREE(&nd, NDF_ONLY_PNBUF);
 			type = nd.ni_vp->v_type;
@@ -1439,7 +1439,7 @@
 
 	NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, pathbuf, td);
 	flags = FREAD;
-	error = vn_open(&nd, &flags, 0);
+	error = vn_open(&nd, &flags, 0, 0);
 	if (error)
 		goto bad;
 	NDFREE(&nd, NDF_ONLY_PNBUF);

==== //depot/projects/trustedbsd/acl/sys/kern/kern_mac.c#3 (text+ko) ====

@@ -1425,7 +1425,7 @@
 
 int
 mac_check_vnode_create(struct ucred *cred, struct vnode *dvp,
-    struct componentname *cnp, struct vattr *vap)
+    struct componentname *cnp, struct vattr *vap, int cmask)
 {
 	int error;
 
@@ -1434,7 +1434,8 @@
 	if (!mac_enforce_fs)
 		return (0);
 
-	MAC_CHECK(check_vnode_create, cred, dvp, &dvp->v_label, cnp, vap);
+	MAC_CHECK(check_vnode_create, cred, dvp, &dvp->v_label, cnp, vap,
+	    cmask);
 	return (error);
 }
 

==== //depot/projects/trustedbsd/acl/sys/kern/kern_sig.c#4 (text+ko) ====

@@ -2067,7 +2067,7 @@
 	struct flock lf;
 	struct nameidata nd;
 	struct vattr vattr;
-	int error, error1, flags;
+	int cmask, error, error1, flags;
 	struct mount *mp;
 	char *name;			/* name of corefile */
 	off_t limit;
@@ -2101,7 +2101,13 @@
 		return (EINVAL);
 	NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, name, td); /* XXXKSE */
 	flags = O_CREAT | FWRITE | O_NOFOLLOW;
-	error = vn_open(&nd, &flags, S_IRUSR | S_IWUSR);
+	/*
+	 * XXXACL: creation mask here? */
+	 */
+	FILEDESC_LOCK(td->td_proc->p_fd);
+	cmask = td->td_proc->p_fd->fd_cmask;
+	FILEDESC_UNLOCK(td->td_proc->p_fd);
+	error = vn_open(&nd, &flags, S_IRUSR | S_IWUSR, cmask);
 	free(name, M_TEMP);
 	if (error)
 		return (error);

==== //depot/projects/trustedbsd/acl/sys/kern/link_elf.c#3 (text+ko) ====

@@ -556,7 +556,7 @@
 
     NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename, td);
     flags = FREAD;
-    error = vn_open(&nd, &flags, 0);
+    error = vn_open(&nd, &flags, 0, 0);
     if (error)
 	return error;
     NDFREE(&nd, NDF_ONLY_PNBUF);

==== //depot/projects/trustedbsd/acl/sys/kern/tty_cons.c#3 (text+ko) ====

@@ -364,7 +364,10 @@
 	}
 	snprintf(path, sizeof(path), "/dev/%s", cnd->cnd_name);
 	NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, path, td);
-	error = vn_open(&nd, &openflag, 0);
+	/*
+	 * XXXACL: Might O_CREAT get passed in here?
+	 */
+	error = vn_open(&nd, &openflag, 0, 0);
 	if (error == 0) {
 		NDFREE(&nd, NDF_ONLY_PNBUF);
 		VOP_UNLOCK(nd.ni_vp, 0, td);

==== //depot/projects/trustedbsd/acl/sys/kern/uipc_usrreq.c#4 (text+ko) ====

@@ -599,7 +599,7 @@
 	struct vnode *vp;
 	struct mount *mp;
 	struct vattr vattr;
-	int error, namelen;
+	int cmask, error, namelen;
 	struct nameidata nd;
 	char *buf;
 
@@ -641,16 +641,20 @@
 		}
 		goto restart;
 	}
+	FILEDESC_LOCK(td->td_proc->p_fd);
+	cmask = td->td_proc->p_fd->fd_cmask;
+	FILEDESC_UNLOCK(td->td_proc->p_fd);
 	VATTR_NULL(&vattr);
 	vattr.va_type = VSOCK;
-	vattr.va_mode = (ACCESSPERMS & ~td->td_proc->p_fd->fd_cmask);
+	vattr.va_mode = ACCESSPERMS;
 #ifdef MAC
 	error = mac_check_vnode_create(td->td_ucred, nd.ni_dvp, &nd.ni_cnd,
-	    &vattr);
+	    &vattr, cmask);
 #endif
 	if (error == 0) {
 		VOP_LEASE(nd.ni_dvp, td, td->td_ucred, LEASE_WRITE);
-		error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);
+		error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr,
+		    cmask);
 	}
 	NDFREE(&nd, NDF_ONLY_PNBUF);
 	vput(nd.ni_dvp);

==== //depot/projects/trustedbsd/acl/sys/kern/vfs_syscalls.c#3 (text+ko) ====

@@ -638,7 +638,7 @@
 	struct vnode *vp;
 	struct vattr vat;
 	struct mount *mp;
-	int cmode, oflags;
+	int cmask, cmode, oflags;
 	struct file *nfp;
 	int type, indx, error;
 	struct flock lf;
@@ -652,7 +652,11 @@
 	if (error)
 		return (error);
 	fp = nfp;
-	cmode = ((mode &~ fdp->fd_cmask) & ALLPERMS) &~ S_ISTXT;
+	/*
+	 * XXXACL: fdp lock?
+	 */
+	cmode = (mode & ALLPERMS) &~ S_ISTXT;
+	cmask = fdp->fd_cmask;
 	NDINIT(&nd, LOOKUP, FOLLOW, pathseg, path, td);
 	td->td_dupfd = -indx - 1;		/* XXX check for fdopen */
 	/*
@@ -660,7 +664,7 @@
 	 * the descriptor while we are blocked in vn_open()
 	 */
 	fhold(fp);
-	error = vn_open(&nd, &flags, cmode);
+	error = vn_open(&nd, &flags, cmode, cmask);
 	if (error) {
 		/*
 		 * release our own reference
@@ -846,7 +850,7 @@
 	struct vnode *vp;
 	struct mount *mp;
 	struct vattr vattr;
-	int error;
+	int cmask, error;
 	int whiteout = 0;
 	struct nameidata nd;
 
@@ -873,9 +877,9 @@
 	} else {
 		VATTR_NULL(&vattr);
 		FILEDESC_LOCK(td->td_proc->p_fd);
-		vattr.va_mode = (mode & ALLPERMS) &
-		    ~td->td_proc->p_fd->fd_cmask;
+		cmask = td->td_proc->p_fd->fd_cmask;
 		FILEDESC_UNLOCK(td->td_proc->p_fd);
+		vattr.va_mode = mode & ALLPERMS;
 		vattr.va_rdev = dev;
 		whiteout = 0;
 
@@ -907,7 +911,7 @@
 #ifdef MAC
 	if (error == 0 && !whiteout)
 		error = mac_check_vnode_create(td->td_ucred, nd.ni_dvp,
-		    &nd.ni_cnd, &vattr);
+		    &nd.ni_cnd, &vattr, cmask);
 #endif
 	if (!error) {
 		VOP_LEASE(nd.ni_dvp, td, td->td_ucred, LEASE_WRITE);
@@ -915,7 +919,7 @@
 			error = VOP_WHITEOUT(nd.ni_dvp, &nd.ni_cnd, CREATE);
 		else {
 			error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp,
-						&nd.ni_cnd, &vattr);
+						&nd.ni_cnd, &vattr, cmask);
 			if (error == 0)
 				vput(nd.ni_vp);
 		}
@@ -955,7 +959,7 @@
 {
 	struct mount *mp;
 	struct vattr vattr;
-	int error;
+	int cmask, error;
 	struct nameidata nd;
 
 restart:
@@ -979,16 +983,17 @@
 	VATTR_NULL(&vattr);
 	vattr.va_type = VFIFO;
 	FILEDESC_LOCK(td->td_proc->p_fd);
-	vattr.va_mode = (mode & ALLPERMS) & ~td->td_proc->p_fd->fd_cmask;
+	cmask = td->td_proc->p_fd->fd_cmask;
 	FILEDESC_UNLOCK(td->td_proc->p_fd);
+	vattr.va_mode = mode & ALLPERMS;
 #ifdef MAC
 	error = mac_check_vnode_create(td->td_ucred, nd.ni_dvp, &nd.ni_cnd,
-	    &vattr);
+	    &vattr, cmask);
 	if (error)
 		goto out;
 #endif
 	VOP_LEASE(nd.ni_dvp, td, td->td_ucred, LEASE_WRITE);
-	error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);
+	error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr, cmask);
 	if (error == 0)
 		vput(nd.ni_vp);
 #ifdef MAC
@@ -1130,17 +1135,19 @@
 	}
 	VATTR_NULL(&vattr);
 	FILEDESC_LOCK(td->td_proc->p_fd);
-	vattr.va_mode = ACCESSPERMS &~ td->td_proc->p_fd->fd_cmask;
+	cmask = td->td_proc->p_fd->fd_cmask;
 	FILEDESC_UNLOCK(td->td_proc->p_fd);
+	vattr.va_mode = ACCESSPERMS;
 #ifdef MAC
 	vattr.va_type = VLNK;
 	error = mac_check_vnode_create(td->td_ucred, nd.ni_dvp, &nd.ni_cnd,
-	    &vattr);
+	    &vattr, cmask);
 	if (error)
 		goto out2;
 #endif
 	VOP_LEASE(nd.ni_dvp, td, td->td_ucred, LEASE_WRITE);
-	error = VOP_SYMLINK(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr, syspath);
+	error = VOP_SYMLINK(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr, syspath,
+	    cmask);
 	if (error == 0)
 		vput(nd.ni_vp);
 #ifdef MAC
@@ -2890,7 +2897,7 @@
 	struct mount *mp;
 	struct vnode *vp;
 	struct vattr vattr;
-	int error;
+	int cmask, error;
 	struct nameidata nd;
 
 restart:
@@ -2924,16 +2931,17 @@
 	VATTR_NULL(&vattr);
 	vattr.va_type = VDIR;
 	FILEDESC_LOCK(td->td_proc->p_fd);
-	vattr.va_mode = (mode & ACCESSPERMS) &~ td->td_proc->p_fd->fd_cmask;
+	cmask = td->td_proc->p_fd->fd_cmask;
 	FILEDESC_UNLOCK(td->td_proc->p_fd);
+	vattr.va_mode = mode & ACCESSPERMS;
 #ifdef MAC
 	error = mac_check_vnode_create(td->td_ucred, nd.ni_dvp, &nd.ni_cnd,
-	    &vattr);
+	    &vattr, cmask);
 	if (error)
 		goto out;
 #endif
 	VOP_LEASE(nd.ni_dvp, td, td->td_ucred, LEASE_WRITE);
-	error = VOP_MKDIR(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);
+	error = VOP_MKDIR(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr, cmask);
 #ifdef MAC
 out:
 #endif

==== //depot/projects/trustedbsd/acl/sys/kern/vfs_vnops.c#4 (text+ko) ====

@@ -77,13 +77,13 @@
 };
 
 int
-vn_open(ndp, flagp, cmode)
+vn_open(ndp, flagp, cmode, cmask)
 	register struct nameidata *ndp;
-	int *flagp, cmode;
+	int *flagp, cmode, cmask;
 {
 	struct thread *td = ndp->ni_cnd.cn_thread;
 
-	return (vn_open_cred(ndp, flagp, cmode, td->td_ucred));
+	return (vn_open_cred(ndp, flagp, cmode, cmask, td->td_ucred));
 }
 
 /*
@@ -94,9 +94,9 @@
  * due to the NDINIT being done elsewhere.
  */
 int
-vn_open_cred(ndp, flagp, cmode, cred)
+vn_open_cred(ndp, flagp, cmode, cmask, cred)
 	register struct nameidata *ndp;
-	int *flagp, cmode;
+	int *flagp, cmode, cmask;
 	struct ucred *cred;
 {
 	struct vnode *vp;
@@ -137,12 +137,12 @@
 			}
 #ifdef MAC
 			error = mac_check_vnode_create(cred, ndp->ni_dvp,
-			    &ndp->ni_cnd, vap);
+			    &ndp->ni_cnd, vap, cmask);
 			if (error == 0) {
 #endif
 				VOP_LEASE(ndp->ni_dvp, td, cred, LEASE_WRITE);
 				error = VOP_CREATE(ndp->ni_dvp, &ndp->ni_vp,
-						   &ndp->ni_cnd, vap);
+						   &ndp->ni_cnd, vap, cmask);
 #ifdef MAC
 			}
 #endif

==== //depot/projects/trustedbsd/acl/sys/kern/vnode_if.src#4 (text+ko) ====

@@ -99,6 +99,7 @@
 	OUT struct vnode **vpp;
 	IN struct componentname *cnp;
 	IN struct vattr *vap;
+	IN int cmask;
 };
 
 #
@@ -119,6 +120,7 @@
 	OUT struct vnode **vpp;
 	IN struct componentname *cnp;
 	IN struct vattr *vap;
+	IN int cmask;
 };
 
 #
@@ -294,6 +296,7 @@
 	OUT struct vnode **vpp;
 	IN struct componentname *cnp;
 	IN struct vattr *vap;
+	IN int cmask;
 };
 
 #
@@ -316,6 +319,7 @@
 	IN struct componentname *cnp;
 	IN struct vattr *vap;
 	IN char *target;
+	IN int cmask;
 };
 
 #

==== //depot/projects/trustedbsd/acl/sys/nfsclient/nfs_lock.c#3 (text+ko) ====

@@ -144,7 +144,7 @@
 	NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, _PATH_LCKFIFO, td);
 
 	fmode = FFLAGS(O_WRONLY);
-	error = vn_open_cred(&nd, &fmode, 0, thread0.td_ucred);
+	error = vn_open_cred(&nd, &fmode, 0, 0, thread0.td_ucred);
 	if (error != 0) {
 		return (error == ENOENT ? EOPNOTSUPP : error);
 	}

==== //depot/projects/trustedbsd/acl/sys/nfsclient/nfs_vnops.c#4 (text+ko) ====

@@ -1291,7 +1291,7 @@
 	struct nfsnode *np = NULL;
 	struct vnode *newvp = NULL;
 	caddr_t bpos, dpos;
-	int error = 0, wccflag = NFSV3_WCCRATTR, gotvp = 0, fmode = 0;
+	int error = 0, wccflag = NFSV3_WCCRATTR, gotvp = 0, fmode = 0, mode, svmode;
 	struct mbuf *mreq, *mrep, *md, *mb;
 	struct vattr vattr;
 	int v3 = NFS_ISV3(dvp);
@@ -1300,13 +1300,14 @@
 	 * Oops, not for me..
 	 */
 	if (vap->va_type == VSOCK)
-		return (nfs_mknodrpc(dvp, ap->a_vpp, cnp, vap));
+		return (nfs_mknodrpc(dvp, ap->a_vpp, cnp, vap, ap->a_cmask));
 
 	if ((error = VOP_GETATTR(dvp, &vattr, cnp->cn_cred, cnp->cn_thread)) != 0) {
 		return (error);
 	}
 	if (vap->va_vaflags & VA_EXCLUSIVE)
 		fmode |= O_EXCL;
+	mode = ap->a_vap->va_mode &~ ap->a_cmask;
 again:
 	nfsstats.rpccnt[NFSPROC_CREATE]++;
 	mreq = nfsm_reqhead(dvp, NFSPROC_CREATE, NFSX_FH(v3) + 2 * NFSX_UNSIGNED +
@@ -1329,11 +1330,18 @@
 			*tl = ++create_verf;
 		} else {
 			*tl = txdr_unsigned(NFSV3CREATE_UNCHECKED);
+			/*
+			 * XXXACL: this uses vap->va_mode, not product
+			 * of va_cmask and va_mode.
+			 */
+			svmode = vap->va_mode;
+			vap->va_mode = mode;
 			nfsm_v3attrbuild(vap, FALSE);
+			vap->va_mode = svmode;
 		}
 	} else {
 		sp = nfsm_build(struct nfsv2_sattr *, NFSX_V2SATTR);
-		sp->sa_mode = vtonfsv2_mode(vap->va_type, vap->va_mode);
+		sp->sa_mode = vtonfsv2_mode(vap->va_type, mode);
 		sp->sa_uid = nfs_xdrneg1;
 		sp->sa_gid = nfs_xdrneg1;
 		sp->sa_size = 0;

==== //depot/projects/trustedbsd/acl/sys/nfsserver/nfs_serv.c#4 (text+ko) ====

@@ -1716,7 +1716,8 @@
 		if (vap->va_mode == (mode_t)VNOVAL)
 			vap->va_mode = 0;
 		if (vap->va_type == VREG || vap->va_type == VSOCK) {
-			error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
+			error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd,
+			    vap, 0);
 			if (error)
 				NDFREE(&nd, NDF_ONLY_PNBUF);
 			else {
@@ -1746,7 +1747,7 @@
 				goto ereply;
                         }
 			vap->va_rdev = rdev;
-			error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
+			error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap, 0);
 			if (error) {
 				NDFREE(&nd, NDF_ONLY_PNBUF);
 				goto ereply;
@@ -1943,13 +1944,13 @@
 	if (vtyp == VSOCK) {
 		vrele(nd.ni_startdir);
 		nd.ni_startdir = NULL;
-		error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
+		error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap, 0);
 		if (error)
 			NDFREE(&nd, NDF_ONLY_PNBUF);
 	} else {
 		if (vtyp != VFIFO && (error = suser_cred(cred, 0)))
 			goto out;
-		error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
+		error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap, 0);
 		if (error) {
 			NDFREE(&nd, NDF_ONLY_PNBUF);
 			goto out;
@@ -2578,7 +2579,7 @@
 	 */
 	if (vap->va_mode == (mode_t)VNOVAL)
 		vap->va_mode = 0;
-	error = VOP_SYMLINK(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap, pathcp);
+	error = VOP_SYMLINK(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap, pathcp, 0);
 	if (error)
 		NDFREE(&nd, NDF_ONLY_PNBUF);
 	else
@@ -2763,7 +2764,7 @@
 	 */
 	if (vap->va_mode == (mode_t)VNOVAL)
 		vap->va_mode = 0;
-	error = VOP_MKDIR(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
+	error = VOP_MKDIR(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap, 0);
 	NDFREE(&nd, NDF_ONLY_PNBUF);
 	vpexcl = 1;
 

==== //depot/projects/trustedbsd/acl/sys/security/mac_biba/mac_biba.c#3 (text+ko) ====

@@ -2016,7 +2016,8 @@
 
 static int
 mac_biba_check_vnode_create(struct ucred *cred, struct vnode *dvp,
-    struct label *dlabel, struct componentname *cnp, struct vattr *vap)
+    struct label *dlabel, struct componentname *cnp, struct vattr *vap,
+    int cmask)
 {
 	struct mac_biba *subj, *obj;
 

==== //depot/projects/trustedbsd/acl/sys/security/mac_lomac/mac_lomac.c#3 (text+ko) ====

@@ -2091,7 +2091,8 @@
 
 static int
 mac_lomac_check_vnode_create(struct ucred *cred, struct vnode *dvp,
-    struct label *dlabel, struct componentname *cnp, struct vattr *vap)
+    struct label *dlabel, struct componentname *cnp, struct vattr *vap,
+    int cmask)
 {
 	struct mac_lomac *subj, *obj;
 

==== //depot/projects/trustedbsd/acl/sys/security/mac_mls/mac_mls.c#3 (text+ko) ====

@@ -1798,7 +1798,8 @@
 
 static int
 mac_mls_check_vnode_create(struct ucred *cred, struct vnode *dvp,
-    struct label *dlabel, struct componentname *cnp, struct vattr *vap)
+    struct label *dlabel, struct componentname *cnp, struct vattr *vap,
+    int cmask)
 {
 	struct mac_mls *subj, *obj;
 

==== //depot/projects/trustedbsd/acl/sys/security/mac_none/mac_none.c#2 (text+ko) ====

@@ -660,7 +660,8 @@
 
 static int
 mac_none_check_vnode_create(struct ucred *cred, struct vnode *dvp,
-    struct label *dlabel, struct componentname *cnp, struct vattr *vap)
+    struct label *dlabel, struct componentname *cnp, struct vattr *vap,
+    int cmask)
 {
 
 	return (0);

==== //depot/projects/trustedbsd/acl/sys/security/mac_test/mac_test.c#2 (text+ko) ====


>>> TRUNCATED FOR MAIL (1000 lines) <<<
To Unsubscribe: send mail to majordomo at trustedbsd.org
with "unsubscribe trustedbsd-cvs" in the body of the message



More information about the trustedbsd-cvs mailing list