From: Zhenyan Wang <maximwang110@gmail.com>
To: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Cc: Christian Brauner <brauner@kernel.org>,
ntfs3@lists.linux.dev, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org,
Zhenyan Wang <maximwang110@gmail.com>
Subject: [PATCH 2/2] fs/ntfs3: keep PrintName not changed when creating symlink
Date: Sun, 27 Sep 2026 18:03:59 +0000 [thread overview]
Message-ID: <20260927180359.3867508-3-maximwang110@gmail.com> (raw)
In-Reply-To: <20260927180359.3867508-1-maximwang110@gmail.com>
When creating a symlink, ntfs3 converts all the '/' to '\' in both
PrintName and SubstituteName.
When reading this symlink, ntfs3 converts all the '\' to '/'. So if you
create a symlink to 'a\b', the result of readlink would be 'a/b'.
Fix this by converting SubstituteName only because SubstituteName is
used by NT kernel to read symlink while PrintName isn't; PrintName is
left unchanged to ensure consistency.
Signed-off-by: Zhenyan Wang <maximwang110@gmail.com>
---
fs/ntfs3/inode.c | 22 +++++++++-------------
1 file changed, 9 insertions(+), 13 deletions(-)
diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c
index 6717563..000ac34 100644
--- a/fs/ntfs3/inode.c
+++ b/fs/ntfs3/inode.c
@@ -1091,6 +1091,7 @@ ntfs_create_reparse_buffer(struct ntfs_sb_info *sbi, const char *symname,
int i, err;
struct REPARSE_DATA_BUFFER *rp;
__le16 *rp_name;
+ __le16 *sub_name;
typeof(rp->SymbolicLinkReparseBuffer) *rs;
bool is_absolute;
@@ -1118,12 +1119,6 @@ ntfs_create_reparse_buffer(struct ntfs_sb_info *sbi, const char *symname,
goto out;
}
- /* Translate Linux '/' into Windows '\'. */
- for (i = 0; i < err; i++) {
- if (rp_name[i] == cpu_to_le16('/'))
- rp_name[i] = cpu_to_le16('\\');
- }
-
rp->ReparseTag = IO_REPARSE_TAG_SYMLINK;
rp->ReparseDataLength =
cpu_to_le16(*nsize - offsetof(struct REPARSE_DATA_BUFFER,
@@ -1142,9 +1137,16 @@ ntfs_create_reparse_buffer(struct ntfs_sb_info *sbi, const char *symname,
*/
rs->Flags = cpu_to_le32(is_absolute ? 0 : SYMLINK_FLAG_RELATIVE);
- memmove(rp_name + err + (is_absolute ? 4 : 0), rp_name,
+ sub_name = rp_name + err + (is_absolute ? 4 : 0);
+ memmove(sub_name, rp_name,
sizeof(short) * err);
+ /* Translate Linux '/' into Windows '\'. */
+ for (i = 0; i < err; i++) {
+ if (sub_name[i] == cpu_to_le16('/'))
+ sub_name[i] = cpu_to_le16('\\');
+ }
+
if (is_absolute) {
/* Decorate SubstituteName. */
rp_name += err;
@@ -2031,12 +2033,6 @@ static noinline int ntfs_readlink_hlp(const struct dentry *link_de,
if (err < 0)
goto out;
- /* Translate Windows '\' into Linux '/'. */
- for (i = 0; i < err; i++) {
- if (buffer[i] == '\\')
- buffer[i] = '/';
- }
-
/* Always set last zero. */
buffer[err] = 0;
--
2.53.0
next prev parent reply other threads:[~2026-09-27 18:06 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-27 18:03 [PATCH 0/2] fs/ntfs3: fixes for directory permission and symlink consistency Zhenyan Wang
2026-09-27 18:03 ` [PATCH 1/2] fs/ntfs3: clear FILE_ATTRIBUTE_READONLY bit when argument 'mode' contains write permission Zhenyan Wang
2026-09-27 18:03 ` Zhenyan Wang [this message]
2026-09-28 7:28 ` [PATCH 2/2] fs/ntfs3: keep PrintName not changed when creating symlink Zhan Xusheng
2026-09-28 8:03 ` Zhenyan Wang
2026-09-27 20:30 ` [PATCH 0/2] fs/ntfs3: fixes for directory permission and symlink consistency Zhenyan Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260927180359.3867508-3-maximwang110@gmail.com \
--to=maximwang110@gmail.com \
--cc=almaz.alexandrovich@paragon-software.com \
--cc=brauner@kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ntfs3@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®