Skip to content

Commit 16a9500

Browse files
committed
smb: client: fix readdir returning wrong type with POSIX extensions
JIRA: https://issues.redhat.com/browse/RHEL-104401 commit b8f89cb Author: Philipp Kerling <[email protected]> Date: Sun Jun 29 19:05:05 2025 +0200 smb: client: fix readdir returning wrong type with POSIX extensions When SMB 3.1.1 POSIX Extensions are negotiated, userspace applications using readdir() or getdents() calls without stat() on each individual file (such as a simple "ls" or "find") would misidentify file types and exhibit strange behavior such as not descending into directories. The reason for this behavior is an oversight in the cifs_posix_to_fattr conversion function. Instead of extracting the entry type for cf_dtype from the properly converted cf_mode field, it tries to extract the type from the PDU. While the wire representation of the entry mode is similar in structure to POSIX stat(), the assignments of the entry types are different. Applying the S_DT macro to cf_mode instead yields the correct result. This is also what the equivalent function smb311_posix_info_to_fattr in inode.c already does for stat() etc.; which is why "ls -l" would give the correct file type but "ls" would not (as identified by the colors). Cc: [email protected] Signed-off-by: Philipp Kerling <[email protected]> Signed-off-by: Steve French <[email protected]> Signed-off-by: Paulo Alcantara <[email protected]>
1 parent 20b5b72 commit 16a9500

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

fs/smb/client/readdir.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ cifs_posix_to_fattr(struct cifs_fattr *fattr, struct smb2_posix_info *info,
263263
/* The Mode field in the response can now include the file type as well */
264264
fattr->cf_mode = wire_mode_to_posix(le32_to_cpu(info->Mode),
265265
fattr->cf_cifsattrs & ATTR_DIRECTORY);
266-
fattr->cf_dtype = S_DT(le32_to_cpu(info->Mode));
266+
fattr->cf_dtype = S_DT(fattr->cf_mode);
267267

268268
switch (fattr->cf_mode & S_IFMT) {
269269
case S_IFLNK:

0 commit comments

Comments
 (0)