On Sun, 21 Jun 2009, Konstantin Belousov wrote:

Log:
 Add another flags argument to vn_open_cred. Use it to specify that some
 vn_open_cred invocations shall not audit namei path.

Modified: head/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c
==============================================================================
--- head/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c    Sun Jun 21 
13:15:56 2009        (r194585)
+++ head/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c    Sun Jun 21 
13:41:32 2009        (r194586)
@@ -85,7 +85,8 @@ kobj_open_file_vnode(const char *file)

        flags = FREAD;
        NDINIT(&nd, LOOKUP, MPSAFE, UIO_SYSSPACE, file, td);
-       error = vn_open_cred(&nd, &flags, O_NOFOLLOW, curthread->td_ucred, 
NULL);
+       error = vn_open_cred(&nd, &flags, O_NOFOLLOW, 0, curthread->td_ucred,
+           NULL);

I was going to ask "why not put the flag in the existing flags arg,
like O_NOFOLLOW here?", but it seems that there is no existing flags
arg and the above O_NOFOLLOW is garbage.  O_NOFOLLOW happens to be
0x100, so I think the above asks for mode S_IRUSR.

Now I will ask "why not put O_NOFOLLOW here and the new flag in the
existing pointer-to-flags arg?".

Modified: head/sys/cddl/compat/opensolaris/sys/vnode.h
==============================================================================
--- head/sys/cddl/compat/opensolaris/sys/vnode.h        Sun Jun 21 13:15:56 
2009        (r194585)
+++ head/sys/cddl/compat/opensolaris/sys/vnode.h        Sun Jun 21 13:41:32 
2009        (r194586)
@@ -182,7 +182,7 @@ vn_openat(char *pnamep, enum uio_seg seg
                vref(startvp);
        NDINIT_ATVP(&nd, operation, MPSAFE, UIO_SYSSPACE, pnamep, startvp, td);
        filemode |= O_NOFOLLOW;
-       error = vn_open_cred(&nd, &filemode, createmode, td->td_ucred, NULL);
+       error = vn_open_cred(&nd, &filemode, createmode, 0, td->td_ucred, NULL);

Here it does put O_NOFOLLOW in the existing pointer-to-flags arg.  It
obfuscates the open-flags variable by naming it filemode.

Modified: head/sys/kern/vfs_vnops.c
==============================================================================
--- head/sys/kern/vfs_vnops.c   Sun Jun 21 13:15:56 2009        (r194585)
+++ head/sys/kern/vfs_vnops.c   Sun Jun 21 13:41:32 2009        (r194586)
@@ -102,11 +102,8 @@ vn_open(ndp, flagp, cmode, fp)
 * due to the NDINIT being done elsewhere.
 */
int
-vn_open_cred(ndp, flagp, cmode, cred, fp)
-       struct nameidata *ndp;
-       int *flagp, cmode;
-       struct ucred *cred;
-       struct file *fp;
+vn_open_cred(struct nameidata *ndp, int *flagp, int cmode, u_int vn_open_flags,
+    struct ucred *cred, struct file *fp)
{
        struct vnode *vp;
        struct mount *mp;
@@ -124,9 +121,11 @@ restart:
        if (fmode & O_CREAT) {

Internally, flags are obfuscated by copying *flagp to the misnamed local
variable fmode.

The pointer-to-flags variable has about 12 spare bits in it.  It already
has just 1 kernel-only flag (O_HASLOCK, misnamed FHASLOCK and misassigned
in the middle of the user flags).  fcntl.h's list of open flags has
been obfuscated by putting AT_ flags in the middle of the list.

Bruce
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to