| From b403f0e37a11f84f7ceaf40b0075499e5bcfd220 Mon Sep 17 00:00:00 2001 |
| From: Miklos Szeredi <mszeredi@redhat.com> |
| Date: Wed, 29 Jun 2016 10:54:23 +0200 |
| Subject: 9p: use file_dentry() |
| |
| From: Miklos Szeredi <mszeredi@redhat.com> |
| |
| commit b403f0e37a11f84f7ceaf40b0075499e5bcfd220 upstream. |
| |
| v9fs may be used as lower layer of overlayfs and accessing f_path.dentry |
| can lead to a crash. In this case it's a NULL pointer dereference in |
| p9_fid_create(). |
| |
| Fix by replacing direct access of file->f_path.dentry with the |
| file_dentry() accessor, which will always return a native object. |
| |
| Reported-by: Alessio Igor Bogani <alessioigorbogani@gmail.com> |
| Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> |
| Tested-by: Alessio Igor Bogani <alessioigorbogani@gmail.com> |
| Fixes: 4bacc9c9234c ("overlayfs: Make f_path always point to the overlay and f_inode to the underlay") |
| Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/9p/vfs_file.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/fs/9p/vfs_file.c |
| +++ b/fs/9p/vfs_file.c |
| @@ -74,7 +74,7 @@ int v9fs_file_open(struct inode *inode, |
| v9fs_proto_dotu(v9ses)); |
| fid = file->private_data; |
| if (!fid) { |
| - fid = v9fs_fid_clone(file->f_path.dentry); |
| + fid = v9fs_fid_clone(file_dentry(file)); |
| if (IS_ERR(fid)) |
| return PTR_ERR(fid); |
| |
| @@ -100,7 +100,7 @@ int v9fs_file_open(struct inode *inode, |
| * because we want write after unlink usecase |
| * to work. |
| */ |
| - fid = v9fs_writeback_fid(file->f_path.dentry); |
| + fid = v9fs_writeback_fid(file_dentry(file)); |
| if (IS_ERR(fid)) { |
| err = PTR_ERR(fid); |
| mutex_unlock(&v9inode->v_mutex); |
| @@ -516,7 +516,7 @@ v9fs_mmap_file_mmap(struct file *filp, s |
| * because we want write after unlink usecase |
| * to work. |
| */ |
| - fid = v9fs_writeback_fid(filp->f_path.dentry); |
| + fid = v9fs_writeback_fid(file_dentry(filp)); |
| if (IS_ERR(fid)) { |
| retval = PTR_ERR(fid); |
| mutex_unlock(&v9inode->v_mutex); |