Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Nov 2012 10:32:35 +0000 (UTC)
From:      Pawel Jakub Dawidek <pjd@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r243612 - in head/sys: kern sys
Message-ID:  <201211271032.qARAWZDR043506@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211271032.qARAWZDR043506>