svn commit: r243612 - in head/sys: kern sys

Pawel Jakub Dawidek pjd at FreeBSD.org
Tue Nov 27 10:32:35 UTC 2012


Author: pjd
Date: Tue Nov 27 10:32:35 2012
New Revision: 243612
URL: http://svnweb.freebsd.org/changeset/base/243612

Log:
  - Add NOCAPCHECK flag to namei that allows lookup to work even if the process
    is in capability mode.
  - Add VN_OPEN_NOCAPCHECK flag for vn_open_cred() to will ne converted into
    NOCAPCHECK namei flag.
  
  This functionality will be used to enable core dumps for sandboxed processes.
  
  Reviewed by:	rwatson
  Obtained from:	WHEEL Systems
  MFC after:	2 weeks

Modified:
  head/sys/kern/vfs_lookup.c
  head/sys/kern/vfs_vnops.c
  head/sys/sys/namei.h
  head/sys/sys/vnode.h

Modified: head/sys/kern/vfs_lookup.c
==============================================================================
--- head/sys/kern/vfs_lookup.c	Tue Nov 27 10:25:03 2012	(r243611)
+++ head/sys/kern/vfs_lookup.c	Tue Nov 27 10:32:35 2012	(r243612)
@@ -183,7 +183,7 @@ namei(struct nameidata *ndp)
 	 * not an absolute path, and not containing '..' components) to
 	 * a real file descriptor, not the pseudo-descriptor AT_FDCWD.
 	 */
-	if (IN_CAPABILITY_MODE(td)) {
+	if (IN_CAPABILITY_MODE(td) && (cnp->cn_flags & NOCAPCHECK) == 0) {
 		ndp->ni_strictrelative = 1;
 		if (ndp->ni_dirfd == AT_FDCWD) {
 #ifdef KTRACE

Modified: head/sys/kern/vfs_vnops.c
==============================================================================
--- head/sys/kern/vfs_vnops.c	Tue Nov 27 10:25:03 2012	(r243611)
+++ head/sys/kern/vfs_vnops.c	Tue Nov 27 10:32:35 2012	(r243612)
@@ -135,6 +135,8 @@ restart:
 			ndp->ni_cnd.cn_flags |= FOLLOW;
 		if (!(vn_open_flags & VN_OPEN_NOAUDIT))
 			ndp->ni_cnd.cn_flags |= AUDITVNODE1;
+		if (vn_open_flags & VN_OPEN_NOCAPCHECK)
+			ndp->ni_cnd.cn_flags |= NOCAPCHECK;
 		bwillwrite();
 		if ((error = namei(ndp)) != 0)
 			return (error);
@@ -188,6 +190,8 @@ restart:
 			ndp->ni_cnd.cn_flags |= LOCKSHARED;
 		if (!(vn_open_flags & VN_OPEN_NOAUDIT))
 			ndp->ni_cnd.cn_flags |= AUDITVNODE1;
+		if (vn_open_flags & VN_OPEN_NOCAPCHECK)
+			ndp->ni_cnd.cn_flags |= NOCAPCHECK;
 		if ((error = namei(ndp)) != 0)
 			return (error);
 		vp = ndp->ni_vp;

Modified: head/sys/sys/namei.h
==============================================================================
--- head/sys/sys/namei.h	Tue Nov 27 10:25:03 2012	(r243611)
+++ head/sys/sys/namei.h	Tue Nov 27 10:32:35 2012	(r243612)
@@ -147,7 +147,8 @@ struct nameidata {
 #define	AUDITVNODE1	0x04000000 /* audit the looked up vnode information */
 #define	AUDITVNODE2 	0x08000000 /* audit the looked up vnode information */
 #define	TRAILINGSLASH	0x10000000 /* path ended in a slash */
-#define	PARAMASK	0x1ffffe00 /* mask of parameter descriptors */
+#define	NOCAPCHECK	0x20000000 /* do not perform capability checks */
+#define	PARAMASK	0x3ffffe00 /* mask of parameter descriptors */
 
 /*
  * Initialization of a nameidata structure.

Modified: head/sys/sys/vnode.h
==============================================================================
--- head/sys/sys/vnode.h	Tue Nov 27 10:25:03 2012	(r243611)
+++ head/sys/sys/vnode.h	Tue Nov 27 10:32:35 2012	(r243612)
@@ -565,6 +565,7 @@ vn_canvmio(struct vnode *vp)
 
 /* vn_open_flags */
 #define	VN_OPEN_NOAUDIT		0x00000001
+#define	VN_OPEN_NOCAPCHECK	0x00000002
 
 /*
  * Public vnode manipulation functions.


More information about the svn-src-head mailing list