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.
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to