+++ /dev/null
-From 79461b2972a2357206773ebdcfe078f37297fa35 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 5 Oct 2024 16:02:56 +0200
-Subject: cifs: Fix creating native symlinks pointing to current or parent
- directory
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Pali Rohár <pali@kernel.org>
-
-[ Upstream commit 63271b7d569fbe924bccc7dadc17d3d07a4e5f7a ]
-
-Calling 'ln -s . symlink' or 'ln -s .. symlink' creates symlink pointing to
-some object name which ends with U+F029 unicode codepoint. This is because
-trailing dot in the object name is replaced by non-ASCII unicode codepoint.
-
-So Linux SMB client currently is not able to create native symlink pointing
-to current or parent directory on Windows SMB server which can be read by
-either on local Windows server or by any other SMB client which does not
-implement compatible-reverse character replacement.
-
-Fix this problem in cifsConvertToUTF16() function which is doing that
-character replacement. Function comment already says that it does not need
-to handle special cases '.' and '..', but after introduction of native
-symlinks in reparse point form, this handling is needed.
-
-Note that this change depends on the previous change
-"cifs: Improve creating native symlinks pointing to directory".
-
-Signed-off-by: Pali Rohár <pali@kernel.org>
-Signed-off-by: Steve French <stfrench@microsoft.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/smb/client/cifs_unicode.c | 17 ++++++++++++++---
- 1 file changed, 14 insertions(+), 3 deletions(-)
-
-diff --git a/fs/smb/client/cifs_unicode.c b/fs/smb/client/cifs_unicode.c
-index e7582dd791794..53f862a9c03cc 100644
---- a/fs/smb/client/cifs_unicode.c
-+++ b/fs/smb/client/cifs_unicode.c
-@@ -485,10 +485,21 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen,
- /**
- * Remap spaces and periods found at the end of every
- * component of the path. The special cases of '.' and
-- * '..' do not need to be dealt with explicitly because
-- * they are addressed in namei.c:link_path_walk().
-+ * '..' are need to be handled because of symlinks.
-+ * They are treated as non-end-of-string to avoid
-+ * remapping and breaking symlinks pointing to . or ..
- **/
-- if ((i == srclen - 1) || (source[i+1] == '\\'))
-+ if ((i == 0 || source[i-1] == '\\') &&
-+ source[i] == '.' &&
-+ (i == srclen-1 || source[i+1] == '\\'))
-+ end_of_string = false; /* "." case */
-+ else if (i >= 1 &&
-+ (i == 1 || source[i-2] == '\\') &&
-+ source[i-1] == '.' &&
-+ source[i] == '.' &&
-+ (i == srclen-1 || source[i+1] == '\\'))
-+ end_of_string = false; /* ".." case */
-+ else if ((i == srclen - 1) || (source[i+1] == '\\'))
- end_of_string = true;
- else
- end_of_string = false;
---
-2.43.0
-