diff mbox series

cifs: alloc_path_with_tree_prefix: do not append sep. if the path is empty

Message ID YczT8K47eA6JqEIB@himera.home (mailing list archive)
State New, archived
Headers show
Series cifs: alloc_path_with_tree_prefix: do not append sep. if the path is empty | expand

Commit Message

Eugene Korenevsky Dec. 29, 2021, 9:32 p.m. UTC
alloc_path_with_tree_prefix() concatenates tree prefix and the path.
Windows CIFS client does not append separator after the tree prefix if
the path is empty. Let's do the same.

This fixes mounting DFS namespaces with names containing non-ASCII symbols.

BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=215440
Signed-off-by: Eugene Korenevsky <ekorenevsky@astralinux.ru>
---
 fs/cifs/smb2pdu.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Comments

Eugene Korenevsky Dec. 29, 2021, 9:40 p.m. UTC | #1
Please pay attention to the bug:
https://bugzilla.kernel.org/show_bug.cgi?id=215440

The patch in previous message is a solution.

But the problem is more
global: after tis patch, Windows SMB server returns undocumented response
STATUS_OBJECT_NAME_INVALID to SMB2 CREATE request for DFS referrals at
non-ASCII DFS namespace. And 'ls' for mounted  non-ASCII DFS namespace
fails.
Eugene Korenevsky Jan. 12, 2022, 5:19 p.m. UTC | #2
On Thu, Dec 30, 2021 at 12:40:31AM +0300, Eugene Korenevsky wrote:


> Please pay attention to the bug:
> https://bugzilla.kernel.org/show_bug.cgi?id=215440

SMB 1.0 ('vers=1.0' mount option) is not affected by this bug.
diff mbox series

Patch

diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index 8b3670388cda..88ea0163257c 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -2527,8 +2527,13 @@  alloc_path_with_tree_prefix(__le16 **out_path, int *out_size, int *out_len,
 
 	cp = load_nls_default();
 	cifs_strtoUTF16(*out_path, treename, treename_len, cp);
-	UniStrcat(*out_path, sep);
-	UniStrcat(*out_path, path);
+
+	/* Do not append the separator if the path is empty */
+	if (path[0] != cpu_to_le16(0x0000)) {
+		UniStrcat(*out_path, sep);
+		UniStrcat(*out_path, path);
+	}
+
 	unload_nls(cp);
 
 	return 0;