mirror of
https://github.com/torvalds/linux.git
synced 2026-09-11 20:13:02 +02:00
smb: client: fix WSL reparse point uid/gid override
wsl_to_fattr() unconditionally overwrites cf_uid/cf_gid with values from WSL extended attributes ($LXUID/$LXGID), ignoring the forceuid and forcegid mount options. Fix this by initializing cf_uid/cf_gid to the mount defaults and gating the $LXUID/$LXGID EA parsing on forceuid/forcegid. Closes: https://sashiko.dev/#/patchset/20260906190803.667489-1-pc%40manguebit.org Reviewed-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Paulo Alcantara <pc@manguebit.org> Cc: Ronnie Sahlberg <ronniesahlberg@gmail.com> Cc: Shyam Prasad N <sprasad@microsoft.com> Cc: Tom Talpey <tom@talpey.com> Cc: Bharath SM <bharathsm@microsoft.com> Cc: stable@vger.kernel.org
This commit is contained in:
parent
18a72975e9
commit
cd2b2b5792
|
|
@ -1137,10 +1137,14 @@ static bool wsl_to_fattr(struct cifs_open_info_data *data,
|
|||
struct cifs_sb_info *cifs_sb,
|
||||
u32 tag, struct cifs_fattr *fattr)
|
||||
{
|
||||
unsigned int sbflags = cifs_sb_flags(cifs_sb);
|
||||
struct smb2_file_full_ea_info *ea;
|
||||
bool have_xattr_dev = false;
|
||||
u32 next = 0;
|
||||
|
||||
fattr->cf_uid = cifs_sb->ctx->linux_uid;
|
||||
fattr->cf_gid = cifs_sb->ctx->linux_gid;
|
||||
|
||||
switch (tag) {
|
||||
case IO_REPARSE_TAG_LX_SYMLINK:
|
||||
fattr->cf_mode |= S_IFLNK;
|
||||
|
|
@ -1177,11 +1181,13 @@ static bool wsl_to_fattr(struct cifs_open_info_data *data,
|
|||
nlen = ea->ea_name_length;
|
||||
v = (void *)((u8 *)ea->ea_data + ea->ea_name_length + 1);
|
||||
|
||||
if (!strncmp(name, SMB2_WSL_XATTR_UID, nlen))
|
||||
fattr->cf_uid = wsl_make_kuid(cifs_sb, v);
|
||||
else if (!strncmp(name, SMB2_WSL_XATTR_GID, nlen))
|
||||
fattr->cf_gid = wsl_make_kgid(cifs_sb, v);
|
||||
else if (!strncmp(name, SMB2_WSL_XATTR_MODE, nlen)) {
|
||||
if (!strncmp(name, SMB2_WSL_XATTR_UID, nlen)) {
|
||||
if (!(sbflags & CIFS_MOUNT_OVERR_UID))
|
||||
fattr->cf_uid = wsl_make_kuid(cifs_sb, v);
|
||||
} else if (!strncmp(name, SMB2_WSL_XATTR_GID, nlen)) {
|
||||
if (!(sbflags & CIFS_MOUNT_OVERR_GID))
|
||||
fattr->cf_gid = wsl_make_kgid(cifs_sb, v);
|
||||
} else if (!strncmp(name, SMB2_WSL_XATTR_MODE, nlen)) {
|
||||
/* File type in reparse point tag and in xattr mode must match. */
|
||||
if (S_DT(fattr->cf_mode) != S_DT(le32_to_cpu(*(__le32 *)v)))
|
||||
return false;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user