| From 8ee031631546cf2f7859cc69593bd60bbdd70b46 Mon Sep 17 00:00:00 2001 |
| From: Tuomas Tynkkynen <tuomas@tuxera.com> |
| Date: Wed, 6 Sep 2017 17:59:07 +0300 |
| Subject: fs/9p: Compare qid.path in v9fs_test_inode |
| |
| From: Tuomas Tynkkynen <tuomas@tuxera.com> |
| |
| commit 8ee031631546cf2f7859cc69593bd60bbdd70b46 upstream. |
| |
| Commit fd2421f54423 ("fs/9p: When doing inode lookup compare qid details |
| and inode mode bits.") transformed v9fs_qid_iget() to use iget5_locked() |
| instead of iget_locked(). However, the test() callback is not checking |
| fid.path at all, which means that a lookup in the inode cache can now |
| accidentally locate a completely wrong inode from the same inode hash |
| bucket if the other fields (qid.type and qid.version) match. |
| |
| Fixes: fd2421f54423 ("fs/9p: When doing inode lookup compare qid details and inode mode bits.") |
| Reviewed-by: Latchesar Ionkov <lucho@ionkov.net> |
| Signed-off-by: Tuomas Tynkkynen <tuomas@tuxera.com> |
| Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/9p/vfs_inode.c | 3 +++ |
| fs/9p/vfs_inode_dotl.c | 3 +++ |
| 2 files changed, 6 insertions(+) |
| |
| --- a/fs/9p/vfs_inode.c |
| +++ b/fs/9p/vfs_inode.c |
| @@ -483,6 +483,9 @@ static int v9fs_test_inode(struct inode |
| |
| if (v9inode->qid.type != st->qid.type) |
| return 0; |
| + |
| + if (v9inode->qid.path != st->qid.path) |
| + return 0; |
| return 1; |
| } |
| |
| --- a/fs/9p/vfs_inode_dotl.c |
| +++ b/fs/9p/vfs_inode_dotl.c |
| @@ -87,6 +87,9 @@ static int v9fs_test_inode_dotl(struct i |
| |
| if (v9inode->qid.type != st->qid.type) |
| return 0; |
| + |
| + if (v9inode->qid.path != st->qid.path) |
| + return 0; |
| return 1; |
| } |
| |