mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-28 21:33:52 +00:00
ksmbd: fix wrong allocation size update in smb2_open()
[ Upstream commit a9f106c765
]
When client send SMB2_CREATE_ALLOCATION_SIZE create context, ksmbd update
old size to ->AllocationSize in smb2 create response. ksmbd_vfs_getattr()
should be called after it to get updated stat result.
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
0505960151
commit
2b5f1692a9
1 changed files with 18 additions and 18 deletions
|
@ -2529,7 +2529,7 @@ static void smb2_new_xattrs(struct ksmbd_tree_connect *tcon, const struct path *
|
|||
da.flags = XATTR_DOSINFO_ATTRIB | XATTR_DOSINFO_CREATE_TIME |
|
||||
XATTR_DOSINFO_ITIME;
|
||||
|
||||
rc = ksmbd_vfs_set_dos_attrib_xattr(mnt_idmap(path->mnt), path, &da, false);
|
||||
rc = ksmbd_vfs_set_dos_attrib_xattr(mnt_idmap(path->mnt), path, &da, true);
|
||||
if (rc)
|
||||
ksmbd_debug(SMB, "failed to store file attribute into xattr\n");
|
||||
}
|
||||
|
@ -3198,23 +3198,6 @@ int smb2_open(struct ksmbd_work *work)
|
|||
goto err_out;
|
||||
}
|
||||
|
||||
rc = ksmbd_vfs_getattr(&path, &stat);
|
||||
if (rc)
|
||||
goto err_out;
|
||||
|
||||
if (stat.result_mask & STATX_BTIME)
|
||||
fp->create_time = ksmbd_UnixTimeToNT(stat.btime);
|
||||
else
|
||||
fp->create_time = ksmbd_UnixTimeToNT(stat.ctime);
|
||||
if (req->FileAttributes || fp->f_ci->m_fattr == 0)
|
||||
fp->f_ci->m_fattr =
|
||||
cpu_to_le32(smb2_get_dos_mode(&stat, le32_to_cpu(req->FileAttributes)));
|
||||
|
||||
if (!created)
|
||||
smb2_update_xattrs(tcon, &path, fp);
|
||||
else
|
||||
smb2_new_xattrs(tcon, &path, fp);
|
||||
|
||||
if (file_present || created)
|
||||
ksmbd_vfs_kern_path_unlock(&parent_path, &path);
|
||||
|
||||
|
@ -3315,6 +3298,23 @@ int smb2_open(struct ksmbd_work *work)
|
|||
}
|
||||
}
|
||||
|
||||
rc = ksmbd_vfs_getattr(&path, &stat);
|
||||
if (rc)
|
||||
goto err_out1;
|
||||
|
||||
if (stat.result_mask & STATX_BTIME)
|
||||
fp->create_time = ksmbd_UnixTimeToNT(stat.btime);
|
||||
else
|
||||
fp->create_time = ksmbd_UnixTimeToNT(stat.ctime);
|
||||
if (req->FileAttributes || fp->f_ci->m_fattr == 0)
|
||||
fp->f_ci->m_fattr =
|
||||
cpu_to_le32(smb2_get_dos_mode(&stat, le32_to_cpu(req->FileAttributes)));
|
||||
|
||||
if (!created)
|
||||
smb2_update_xattrs(tcon, &path, fp);
|
||||
else
|
||||
smb2_new_xattrs(tcon, &path, fp);
|
||||
|
||||
memcpy(fp->client_guid, conn->ClientGUID, SMB2_CLIENT_GUID_SIZE);
|
||||
|
||||
rsp->StructureSize = cpu_to_le16(89);
|
||||
|
|
Loading…
Reference in a new issue