public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Pali Rohár" <pali@kernel.org>
To: Steve French <sfrench@samba.org>,
	Paulo Alcantara <pc@manguebit.com>,
	Ronnie Sahlberg <ronniesahlberg@gmail.com>
Cc: linux-cifs@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 3/8] cifs: Fix parsing NFS-style char/block devices
Date: Sat, 28 Sep 2024 23:59:43 +0200	[thread overview]
Message-ID: <20240928215948.4494-4-pali@kernel.org> (raw)
In-Reply-To: <20240928215948.4494-1-pali@kernel.org>

Linux SMB client currently parses NFS-style char and block devices
incorrectly. It reads major number from location of minor and major from
location of minor.

Per MS-FSCC 2.1.2.6 NFS_SPECFILE_CHR and NFS_SPECFILE_BLK DataBuffer's
field contains two 32-bit integers that represent major and minor device
numbers.

So the first one 32-bit integer in DataBuffer is major number and second
one in DataBuffer is minor number. Microsoft Windows NFS server reads them
in this order too.

This issue was introduced in commit 45e724022e27 ("smb: client: set correct
file type from NFS reparse points") and probably because in commit message
was test of char and block devices with same major and minor numbers. So
swapped major and minor numbers were not spotted.

Fix this problem in Linux SMB client by reading major and minor numbers
from correct position of DataBuffer.

This change fixes interoperability of char and block devices on Windows
share which is exported over both SMB and NFS protocols.

Fixes: 45e724022e27 ("smb: client: set correct file type from NFS reparse points")
Signed-off-by: Pali Rohár <pali@kernel.org>
---
 fs/smb/client/reparse.h | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/fs/smb/client/reparse.h b/fs/smb/client/reparse.h
index 2c0644bc4e65..790360f8a53b 100644
--- a/fs/smb/client/reparse.h
+++ b/fs/smb/client/reparse.h
@@ -20,9 +20,12 @@
 
 static inline dev_t reparse_nfs_mkdev(struct reparse_posix_data *buf)
 {
-	u64 v = le64_to_cpu(*(__le64 *)buf->DataBuffer);
+	u32 major, minor;
 
-	return MKDEV(v >> 32, v & 0xffffffff);
+	major = le32_to_cpu(((__le32 *)buf->DataBuffer)[0]);
+	minor = le32_to_cpu(((__le32 *)buf->DataBuffer)[1]);
+
+	return MKDEV(major, minor);
 }
 
 static inline dev_t wsl_mkdev(void *ptr)
-- 
2.20.1


  parent reply	other threads:[~2024-09-28 22:00 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-28 21:59 [PATCH 0/8] cifs: Fix support for NFS-style reparse points Pali Rohár
2024-09-28 21:59 ` [PATCH 1/8] smb: Update comments about some reparse point tags Pali Rohár
2024-09-28 21:59 ` [PATCH 2/8] cifs: Remove intermediate object of failed create reparse call Pali Rohár
2024-09-29 12:53   ` Pali Rohár
2024-09-29 14:03   ` [PATCH v2] " Pali Rohár
2024-09-29 16:01     ` Steve French
2024-09-30 15:25   ` [PATCH 2/8] " Paulo Alcantara
2024-09-30 17:20     ` Pali Rohár
2024-09-30 21:33       ` Paulo Alcantara
2024-09-30 20:25   ` [PATCH v3] " Pali Rohár
2024-09-30 21:33     ` Steve French
2024-09-28 21:59 ` Pali Rohár [this message]
2024-09-28 21:59 ` [PATCH 4/8] cifs: Fix creating NFS-style char/block devices Pali Rohár
2024-09-29  0:18   ` Steve French
2024-09-29  0:44     ` Pali Rohár
     [not found]       ` <CAH2r5mvbUhcW_c46oUiHzfPg97n5qiRg9kzpCkmzG9uHygOF3g@mail.gmail.com>
2024-09-29  0:51         ` Pali Rohár
2024-09-28 21:59 ` [PATCH 5/8] cifs: Fix buffer overflow when parsing NFS reparse points Pali Rohár
2024-09-29 10:22   ` [PATCH v2] " Pali Rohár
2024-09-28 21:59 ` [PATCH 6/8] cifs: Do not convert delimiter when parsing NFS-style symlinks Pali Rohár
2024-09-28 21:59 ` [PATCH 7/8] cifs: Validate content of NFS reparse point buffer Pali Rohár
2024-09-28 21:59 ` [PATCH 8/8] cifs: Rename posix to nfs in parse_reparse_posix() and reparse_posix_data Pali Rohár
2024-09-29  4:57   ` Steve French
2024-09-29  9:09     ` Ralph Boehme
2024-09-29  9:26       ` Pali Rohár
2024-09-29 12:52         ` Ralph Boehme
2024-09-29 15:43           ` Steve French

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=20240928215948.4494-4-pali@kernel.org \
    --to=pali@kernel.org \
    --cc=linux-cifs@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pc@manguebit.com \
    --cc=ronniesahlberg@gmail.com \
    --cc=sfrench@samba.org \
    /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