mirror of
https://gitlab.com/apparmor/apparmor.git
synced 2025-03-04 08:24:42 +01:00
50 lines
1.2 KiB
Diff
50 lines
1.2 KiB
Diff
From: Andreas Gruenbacher <agruen@suse.de>
|
|
Subject: Switch to vfs_permission() in sys_fchdir()
|
|
|
|
Switch from file_permission() to vfs_permission() in sys_fchdir(): this
|
|
avoids calling permission() with a NULL nameidata here.
|
|
|
|
Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
|
|
|
|
---
|
|
fs/open.c | 16 +++++++---------
|
|
1 file changed, 7 insertions(+), 9 deletions(-)
|
|
|
|
--- a/fs/open.c
|
|
+++ b/fs/open.c
|
|
@@ -440,10 +440,8 @@ out:
|
|
|
|
asmlinkage long sys_fchdir(unsigned int fd)
|
|
{
|
|
+ struct nameidata nd;
|
|
struct file *file;
|
|
- struct dentry *dentry;
|
|
- struct inode *inode;
|
|
- struct vfsmount *mnt;
|
|
int error;
|
|
|
|
error = -EBADF;
|
|
@@ -451,17 +449,17 @@ asmlinkage long sys_fchdir(unsigned int
|
|
if (!file)
|
|
goto out;
|
|
|
|
- dentry = file->f_path.dentry;
|
|
- mnt = file->f_path.mnt;
|
|
- inode = dentry->d_inode;
|
|
+ nd.dentry = file->f_path.dentry;
|
|
+ nd.mnt = file->f_path.mnt;
|
|
+ nd.flags = 0;
|
|
|
|
error = -ENOTDIR;
|
|
- if (!S_ISDIR(inode->i_mode))
|
|
+ if (!S_ISDIR(nd.dentry->d_inode->i_mode))
|
|
goto out_putf;
|
|
|
|
- error = file_permission(file, MAY_EXEC);
|
|
+ error = vfs_permission(&nd, MAY_EXEC);
|
|
if (!error)
|
|
- set_fs_pwd(current->fs, mnt, dentry);
|
|
+ set_fs_pwd(current->fs, nd.mnt, nd.dentry);
|
|
out_putf:
|
|
fput(file);
|
|
out:
|