diff options
Diffstat (limited to 'fs/open.c')
-rw-r--r-- | fs/open.c | 18 |
1 files changed, 10 insertions, 8 deletions
@@ -251,7 +251,7 @@ static long do_sys_truncate(const char __user * path, loff_t length) | |||
251 | if (error) | 251 | if (error) |
252 | goto dput_and_out; | 252 | goto dput_and_out; |
253 | 253 | ||
254 | error = vfs_permission(&nd, MAY_WRITE); | 254 | error = inode_permission(inode, MAY_WRITE); |
255 | if (error) | 255 | if (error) |
256 | goto mnt_drop_write_and_out; | 256 | goto mnt_drop_write_and_out; |
257 | 257 | ||
@@ -426,6 +426,7 @@ out: | |||
426 | asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode) | 426 | asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode) |
427 | { | 427 | { |
428 | struct nameidata nd; | 428 | struct nameidata nd; |
429 | struct inode *inode; | ||
429 | int old_fsuid, old_fsgid; | 430 | int old_fsuid, old_fsgid; |
430 | kernel_cap_t uninitialized_var(old_cap); /* !SECURE_NO_SETUID_FIXUP */ | 431 | kernel_cap_t uninitialized_var(old_cap); /* !SECURE_NO_SETUID_FIXUP */ |
431 | int res; | 432 | int res; |
@@ -461,7 +462,9 @@ asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode) | |||
461 | if (res) | 462 | if (res) |
462 | goto out; | 463 | goto out; |
463 | 464 | ||
464 | if ((mode & MAY_EXEC) && S_ISREG(nd.path.dentry->d_inode->i_mode)) { | 465 | inode = nd.path.dentry->d_inode; |
466 | |||
467 | if ((mode & MAY_EXEC) && S_ISREG(inode->i_mode)) { | ||
465 | /* | 468 | /* |
466 | * MAY_EXEC on regular files is denied if the fs is mounted | 469 | * MAY_EXEC on regular files is denied if the fs is mounted |
467 | * with the "noexec" flag. | 470 | * with the "noexec" flag. |
@@ -471,10 +474,9 @@ asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode) | |||
471 | goto out_path_release; | 474 | goto out_path_release; |
472 | } | 475 | } |
473 | 476 | ||
474 | res = vfs_permission(&nd, mode | MAY_ACCESS); | 477 | res = inode_permission(inode, mode | MAY_ACCESS); |
475 | /* SuS v2 requires we report a read only fs too */ | 478 | /* SuS v2 requires we report a read only fs too */ |
476 | if(res || !(mode & S_IWOTH) || | 479 | if (res || !(mode & S_IWOTH) || special_file(inode->i_mode)) |
477 | special_file(nd.path.dentry->d_inode->i_mode)) | ||
478 | goto out_path_release; | 480 | goto out_path_release; |
479 | /* | 481 | /* |
480 | * This is a rare case where using __mnt_is_readonly() | 482 | * This is a rare case where using __mnt_is_readonly() |
@@ -515,7 +517,7 @@ asmlinkage long sys_chdir(const char __user * filename) | |||
515 | if (error) | 517 | if (error) |
516 | goto out; | 518 | goto out; |
517 | 519 | ||
518 | error = vfs_permission(&nd, MAY_EXEC | MAY_ACCESS); | 520 | error = inode_permission(nd.path.dentry->d_inode, MAY_EXEC | MAY_ACCESS); |
519 | if (error) | 521 | if (error) |
520 | goto dput_and_out; | 522 | goto dput_and_out; |
521 | 523 | ||
@@ -544,7 +546,7 @@ asmlinkage long sys_fchdir(unsigned int fd) | |||
544 | if (!S_ISDIR(inode->i_mode)) | 546 | if (!S_ISDIR(inode->i_mode)) |
545 | goto out_putf; | 547 | goto out_putf; |
546 | 548 | ||
547 | error = file_permission(file, MAY_EXEC | MAY_ACCESS); | 549 | error = inode_permission(inode, MAY_EXEC | MAY_ACCESS); |
548 | if (!error) | 550 | if (!error) |
549 | set_fs_pwd(current->fs, &file->f_path); | 551 | set_fs_pwd(current->fs, &file->f_path); |
550 | out_putf: | 552 | out_putf: |
@@ -562,7 +564,7 @@ asmlinkage long sys_chroot(const char __user * filename) | |||
562 | if (error) | 564 | if (error) |
563 | goto out; | 565 | goto out; |
564 | 566 | ||
565 | error = vfs_permission(&nd, MAY_EXEC | MAY_ACCESS); | 567 | error = inode_permission(nd.path.dentry->d_inode, MAY_EXEC | MAY_ACCESS); |
566 | if (error) | 568 | if (error) |
567 | goto dput_and_out; | 569 | goto dput_and_out; |
568 | 570 | ||