| From 70cdf6cbe004f47a5d9ad187930c3ecfb81cccc8 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 10 Feb 2021 08:59:52 +0000 |
| Subject: afs: Fix updating of i_mode due to 3rd party change |
| |
| From: David Howells <dhowells@redhat.com> |
| |
| [ Upstream commit 6e1eb04a87f954eb06a89ee6034c166351dfff6e ] |
| |
| Fix afs_apply_status() to mask off the irrelevant bits from status->mode |
| when OR'ing them into i_mode. This can happen when a 3rd party chmod |
| occurs. |
| |
| Also fix afs_inode_init_from_status() to mask off the mode bits when |
| initialising i_mode. |
| |
| Fixes: 260a980317da ("[AFS]: Add "directory write" support.") |
| Reported-by: Al Viro <viro@zeniv.linux.org.uk> |
| Signed-off-by: David Howells <dhowells@redhat.com> |
| Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/afs/inode.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/fs/afs/inode.c b/fs/afs/inode.c |
| index 1d03eb1920ec..bf44e245d7dc 100644 |
| --- a/fs/afs/inode.c |
| +++ b/fs/afs/inode.c |
| @@ -102,13 +102,13 @@ static int afs_inode_init_from_status(struct afs_operation *op, |
| |
| switch (status->type) { |
| case AFS_FTYPE_FILE: |
| - inode->i_mode = S_IFREG | status->mode; |
| + inode->i_mode = S_IFREG | (status->mode & S_IALLUGO); |
| inode->i_op = &afs_file_inode_operations; |
| inode->i_fop = &afs_file_operations; |
| inode->i_mapping->a_ops = &afs_fs_aops; |
| break; |
| case AFS_FTYPE_DIR: |
| - inode->i_mode = S_IFDIR | status->mode; |
| + inode->i_mode = S_IFDIR | (status->mode & S_IALLUGO); |
| inode->i_op = &afs_dir_inode_operations; |
| inode->i_fop = &afs_dir_file_operations; |
| inode->i_mapping->a_ops = &afs_dir_aops; |
| @@ -198,7 +198,7 @@ static void afs_apply_status(struct afs_operation *op, |
| if (status->mode != vnode->status.mode) { |
| mode = inode->i_mode; |
| mode &= ~S_IALLUGO; |
| - mode |= status->mode; |
| + mode |= status->mode & S_IALLUGO; |
| WRITE_ONCE(inode->i_mode, mode); |
| } |
| |
| -- |
| 2.30.2 |
| |