]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
vfs: re-introduce MAY_CHDIR
authorEric Paris <eparis@redhat.com>
Fri, 23 Jul 2010 15:43:51 +0000 (11:43 -0400)
committerJames Morris <jmorris@namei.org>
Mon, 2 Aug 2010 05:35:06 +0000 (15:35 +1000)
Currently MAY_ACCESS means that filesystems must check the permissions
right then and not rely on cached results or the results of future
operations on the object.  This can be because of a call to sys_access() or
because of a call to chdir() which needs to check search without relying on
any future operations inside that dir.  I plan to use MAY_ACCESS for other
purposes in the security system, so I split the MAY_ACCESS and the
MAY_CHDIR cases.

Signed-off-by: Eric Paris <eparis@redhat.com>
Acked-by: Stephen D. Smalley <sds@tycho.nsa.gov>
Signed-off-by: James Morris <jmorris@namei.org>
fs/fuse/dir.c
fs/nfs/dir.c
fs/open.c
include/linux/fs.h

index 3cdc5f78a406357a7e4bcbffe5783facd35c7236..431be0795b6bdf27c43ca34a093c52ca127a77af 100644 (file)
@@ -1016,7 +1016,7 @@ static int fuse_permission(struct inode *inode, int mask)
                   exist.  So if permissions are revoked this won't be
                   noticed immediately, only after the attribute
                   timeout has expired */
-       } else if (mask & MAY_ACCESS) {
+       } else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
                err = fuse_access(inode, mask);
        } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
                if (!(inode->i_mode & S_IXUGO)) {
index e60416d3f8188b548ec1d55e3438ea7e6f2c926f..832e9e2393248968b793df0302433c4e1f8b052f 100644 (file)
@@ -1953,7 +1953,7 @@ int nfs_permission(struct inode *inode, int mask)
        if ((mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) == 0)
                goto out;
        /* Is this sys_access() ? */
-       if (mask & MAY_ACCESS)
+       if (mask & (MAY_ACCESS | MAY_CHDIR))
                goto force_lookup;
 
        switch (inode->i_mode & S_IFMT) {
index a54ed85209c135a9767cc6ee3f73c4619a105f33..0d1fa3dc0efb53f0f42051d4dde9ac4a4503c876 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -366,7 +366,7 @@ SYSCALL_DEFINE1(chdir, const char __user *, filename)
        if (error)
                goto out;
 
-       error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_ACCESS);
+       error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
        if (error)
                goto dput_and_out;
 
@@ -395,7 +395,7 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd)
        if (!S_ISDIR(inode->i_mode))
                goto out_putf;
 
-       error = inode_permission(inode, MAY_EXEC | MAY_ACCESS);
+       error = inode_permission(inode, MAY_EXEC | MAY_CHDIR);
        if (!error)
                set_fs_pwd(current->fs, &file->f_path);
 out_putf:
@@ -413,7 +413,7 @@ SYSCALL_DEFINE1(chroot, const char __user *, filename)
        if (error)
                goto out;
 
-       error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_ACCESS);
+       error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
        if (error)
                goto dput_and_out;
 
index 68ca1b0491af42051bb6e93f424b3741c1ed7278..7d94b72f034635c06e6bf623d9e13039d3b55b94 100644 (file)
@@ -53,6 +53,7 @@ struct inodes_stat_t {
 #define MAY_APPEND 8
 #define MAY_ACCESS 16
 #define MAY_OPEN 32
+#define MAY_CHDIR 64
 
 /*
  * flags in file.f_mode.  Note that FMODE_READ and FMODE_WRITE must correspond