Skip to content

Commit

Permalink
ksmbd: remove setattr preparations in set_file_basic_info()
Browse files Browse the repository at this point in the history
Permission checking and copying over ownership information is the task
of the underlying filesystem not ksmbd. The order is also wrong here.
This modifies the inode before notify_change(). If notify_change() fails
this will have changed ownership nonetheless. All of this is unnecessary
though since the underlying filesystem's ->setattr handler will do all
this (if required) by itself.

Cc: Steve French <stfrench@microsoft.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Namjae Jeon <namjae.jeon@samsung.com>
Cc: Hyunchul Lee <hyc.lee@gmail.com>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: linux-cifs@vger.kernel.org
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
  • Loading branch information
Christian Brauner authored and Steve French committed Sep 4, 2021
1 parent eb5784f commit db7fb6f
Showing 1 changed file with 8 additions and 17 deletions.
25 changes: 8 additions & 17 deletions fs/ksmbd/smb2pdu.c
Original file line number Diff line number Diff line change
Expand Up @@ -5440,7 +5440,7 @@ static int set_file_basic_info(struct ksmbd_file *fp, char *buf,
{
struct smb2_file_all_info *file_info;
struct iattr attrs;
struct iattr temp_attrs;
struct timespec64 ctime;
struct file *filp;
struct inode *inode;
struct user_namespace *user_ns;
Expand All @@ -5464,11 +5464,11 @@ static int set_file_basic_info(struct ksmbd_file *fp, char *buf,
}

if (file_info->ChangeTime) {
temp_attrs.ia_ctime = ksmbd_NTtimeToUnix(file_info->ChangeTime);
attrs.ia_ctime = temp_attrs.ia_ctime;
attrs.ia_ctime = ksmbd_NTtimeToUnix(file_info->ChangeTime);
ctime = attrs.ia_ctime;
attrs.ia_valid |= ATTR_CTIME;
} else {
temp_attrs.ia_ctime = inode->i_ctime;
ctime = inode->i_ctime;
}

if (file_info->LastWriteTime) {
Expand Down Expand Up @@ -5507,28 +5507,19 @@ static int set_file_basic_info(struct ksmbd_file *fp, char *buf,
rc = 0;
}

/*
* HACK : set ctime here to avoid ctime changed
* when file_info->ChangeTime is zero.
*/
attrs.ia_ctime = temp_attrs.ia_ctime;
attrs.ia_valid |= ATTR_CTIME;

if (attrs.ia_valid) {
struct dentry *dentry = filp->f_path.dentry;
struct inode *inode = d_inode(dentry);

if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
return -EACCES;

rc = setattr_prepare(user_ns, dentry, &attrs);
if (rc)
return -EINVAL;

inode_lock(inode);
setattr_copy(user_ns, inode, &attrs);
attrs.ia_valid &= ~ATTR_CTIME;
rc = notify_change(user_ns, dentry, &attrs, NULL);
if (!rc) {
inode->i_ctime = ctime;
mark_inode_dirty(inode);
}
inode_unlock(inode);
}
return rc;
Expand Down

0 comments on commit db7fb6f

Please sign in to comment.