diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2008-07-17 09:19:08 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2008-07-26 20:53:21 -0400 |
commit | a110343f0d6d41f68b7cf8c00b57a3172c67f816 (patch) | |
tree | 04f57e3454e796765a7395d2ece4739cf536ae9f /fs/open.c | |
parent | 7f2da1e7d0330395e5e9e350b879b98a1ea495df (diff) |
[PATCH] fix MAY_CHDIR/MAY_ACCESS/LOOKUP_ACCESS mess
* MAY_CHDIR is redundant - it's an equivalent of MAY_ACCESS
* MAY_ACCESS on fuse should affect only the last step of pathname resolution
* fchdir() and chroot() should pass MAY_ACCESS, for the same reason why
chdir() needs that.
* now that we pass MAY_ACCESS explicitly in all cases, LOOKUP_ACCESS can be
removed; it has no business being in nameidata.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/open.c')
-rw-r--r-- | fs/open.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -457,11 +457,11 @@ asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode) | |||
457 | old_cap = cap_set_effective(current->cap_permitted); | 457 | old_cap = cap_set_effective(current->cap_permitted); |
458 | } | 458 | } |
459 | 459 | ||
460 | res = __user_walk_fd(dfd, filename, LOOKUP_FOLLOW|LOOKUP_ACCESS, &nd); | 460 | res = __user_walk_fd(dfd, filename, LOOKUP_FOLLOW, &nd); |
461 | if (res) | 461 | if (res) |
462 | goto out; | 462 | goto out; |
463 | 463 | ||
464 | res = vfs_permission(&nd, mode); | 464 | res = vfs_permission(&nd, mode | MAY_ACCESS); |
465 | /* SuS v2 requires we report a read only fs too */ | 465 | /* SuS v2 requires we report a read only fs too */ |
466 | if(res || !(mode & S_IWOTH) || | 466 | if(res || !(mode & S_IWOTH) || |
467 | special_file(nd.path.dentry->d_inode->i_mode)) | 467 | special_file(nd.path.dentry->d_inode->i_mode)) |
@@ -505,7 +505,7 @@ asmlinkage long sys_chdir(const char __user * filename) | |||
505 | if (error) | 505 | if (error) |
506 | goto out; | 506 | goto out; |
507 | 507 | ||
508 | error = vfs_permission(&nd, MAY_EXEC | MAY_CHDIR); | 508 | error = vfs_permission(&nd, MAY_EXEC | MAY_ACCESS); |
509 | if (error) | 509 | if (error) |
510 | goto dput_and_out; | 510 | goto dput_and_out; |
511 | 511 | ||
@@ -534,7 +534,7 @@ asmlinkage long sys_fchdir(unsigned int fd) | |||
534 | if (!S_ISDIR(inode->i_mode)) | 534 | if (!S_ISDIR(inode->i_mode)) |
535 | goto out_putf; | 535 | goto out_putf; |
536 | 536 | ||
537 | error = file_permission(file, MAY_EXEC); | 537 | error = file_permission(file, MAY_EXEC | MAY_ACCESS); |
538 | if (!error) | 538 | if (!error) |
539 | set_fs_pwd(current->fs, &file->f_path); | 539 | set_fs_pwd(current->fs, &file->f_path); |
540 | out_putf: | 540 | out_putf: |
@@ -552,7 +552,7 @@ asmlinkage long sys_chroot(const char __user * filename) | |||
552 | if (error) | 552 | if (error) |
553 | goto out; | 553 | goto out; |
554 | 554 | ||
555 | error = vfs_permission(&nd, MAY_EXEC); | 555 | error = vfs_permission(&nd, MAY_EXEC | MAY_ACCESS); |
556 | if (error) | 556 | if (error) |
557 | goto dput_and_out; | 557 | goto dput_and_out; |
558 | 558 | ||