[PATCH] cifs: Fix getting reparse points from server without WSL support

From: Pali Rohár
Date: Fri Sep 13 2024 - 16:02:37 EST


If SMB server does not support WSL EAs then for SMB2_OP_QUERY_WSL_EA
request it returns STATUS_EAS_NOT_SUPPORTED. Function smb2_compound_op()
translates STATUS_EAS_NOT_SUPPORTED to -EOPNOTSUPP which cause failure
during calling lstat() syscall from userspace on any reparse point,
including Native SMB symlink (which does not use any EAs). This issue
happen for example when trying to resolve Native NTFS symlink from SMB
server on Windows 8.

Avoid this problem by calling SMB2_OP_QUERY_WSL_EA only when detected
reparse point is of WSL type. Note that this is not solve this problem
fully as WSL reparse points can be created also on other SMB server
which do not support Extended Attributes at all.

Fixes: ea41367b2a60 ("smb: client: introduce SMB2_OP_QUERY_WSL_EA")
Signed-off-by: Pali Rohár <pali@xxxxxxxxxx>
---
fs/smb/client/smb2inode.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/fs/smb/client/smb2inode.c b/fs/smb/client/smb2inode.c
index 11a1c53c64e0..d65471aa55e6 100644
--- a/fs/smb/client/smb2inode.c
+++ b/fs/smb/client/smb2inode.c
@@ -941,7 +941,20 @@ int smb2_query_path_info(const unsigned int xid,
if (rc || !data->reparse_point)
goto out;

- cmds[num_cmds++] = SMB2_OP_QUERY_WSL_EA;
+ /*
+ * Skip SMB2_OP_QUERY_WSL_EA if reparse point is not WSL.
+ * The server file system does not have to support Extended
+ * Attributes and in this case returns STATUS_EAS_NOT_SUPPORTED
+ * which smb2_compound_op() translate to -EOPNOTSUPP. This will
+ * present failure during reading of non-WSL special files.
+ */
+ if (data->reparse.tag == IO_REPARSE_TAG_LX_SYMLINK ||
+ data->reparse.tag == IO_REPARSE_TAG_AF_UNIX ||
+ data->reparse.tag == IO_REPARSE_TAG_LX_FIFO ||
+ data->reparse.tag == IO_REPARSE_TAG_LX_CHR ||
+ data->reparse.tag == IO_REPARSE_TAG_LX_BLK)
+ cmds[num_cmds++] = SMB2_OP_QUERY_WSL_EA;
+
/*
* Skip SMB2_OP_GET_REPARSE if symlink already parsed in create
* response.
--
2.20.1