mirror of
https://github.com/torvalds/linux.git
synced 2026-09-12 12:34:02 +02:00
smb: client: fix file type corruption in posix_reparse_to_fattr()
Setting the file type in cf_mode without clearing the existing S_IFMT bits first is wrong as it corrupts the file type when cf_mode already has type bits set (e.g. S_IFREG | S_IFCHR == S_IFLNK). Use a local ftype variable to collect the new file type and apply it after validation succeeds, clearing S_IFMT and setting the new type in a single assignment. This avoids stripping cf_mode on malformed reparse points where the function returns false early. Closes: https://sashiko.dev/#/patchset/20260906172005.627163-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
fa7a2cfcf1
commit
65d5dbdc08
|
|
@ -1212,6 +1212,7 @@ static bool posix_reparse_to_fattr(struct cifs_sb_info *cifs_sb,
|
|||
struct cifs_open_info_data *data)
|
||||
{
|
||||
struct reparse_nfs_data_buffer *buf = (struct reparse_nfs_data_buffer *)data->reparse.buf;
|
||||
umode_t ftype;
|
||||
|
||||
if (buf == NULL)
|
||||
return true;
|
||||
|
|
@ -1227,7 +1228,7 @@ static bool posix_reparse_to_fattr(struct cifs_sb_info *cifs_sb,
|
|||
WARN_ON_ONCE(1);
|
||||
return false;
|
||||
}
|
||||
fattr->cf_mode |= S_IFCHR;
|
||||
ftype = S_IFCHR;
|
||||
fattr->cf_rdev = reparse_mkdev(buf->DataBuffer);
|
||||
break;
|
||||
case NFS_SPECFILE_BLK:
|
||||
|
|
@ -1235,22 +1236,23 @@ static bool posix_reparse_to_fattr(struct cifs_sb_info *cifs_sb,
|
|||
WARN_ON_ONCE(1);
|
||||
return false;
|
||||
}
|
||||
fattr->cf_mode |= S_IFBLK;
|
||||
ftype = S_IFBLK;
|
||||
fattr->cf_rdev = reparse_mkdev(buf->DataBuffer);
|
||||
break;
|
||||
case NFS_SPECFILE_FIFO:
|
||||
fattr->cf_mode |= S_IFIFO;
|
||||
ftype = S_IFIFO;
|
||||
break;
|
||||
case NFS_SPECFILE_SOCK:
|
||||
fattr->cf_mode |= S_IFSOCK;
|
||||
ftype = S_IFSOCK;
|
||||
break;
|
||||
case NFS_SPECFILE_LNK:
|
||||
fattr->cf_mode |= S_IFLNK;
|
||||
ftype = S_IFLNK;
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
return false;
|
||||
}
|
||||
fattr->cf_mode = (fattr->cf_mode & ~S_IFMT) | ftype;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user