* [PATCH 1/2] ksmbd: fix negative timestamps being saved to disk
@ 2026-11-12 11:16 koraynilay
2026-11-12 11:16 ` [PATCH 2/2] cifs: fix negative timestamps being read from smb koraynilay
2026-11-12 18:27 ` [PATCH 1/2] ksmbd: fix negative timestamps being saved to disk Ian Bridges
0 siblings, 2 replies; 3+ messages in thread
From: koraynilay @ 2026-11-12 11:16 UTC (permalink / raw)
To: Namjae Jeon, Paulo Alcantara
Cc: Sergey Senozhatsky, Tom Talpey, ChenXiaoSong, Hyunchul Lee,
Ronnie Sahlberg, Shyam Prasad N, Bharath SM, linux-cifs,
samba-technical, linux-kernel, koraynilay, stable
When setting a timestamp before epoch 0, ksmbd converts it from NT
format to Unix format without normalizing it, leading to the nanoseconds
field to be saved (on-disk too) as a negative number, which leads to a
garbled stat command output and a reported +4 seconds in the timestamp.
This bug also violates a struct timespec64 invariant, as documented in
the set_normalized_timespec64() kernel-doc:
[...]
* Note: The tv_nsec part is always in the range of 0 <= tv_nsec < NSEC_PER_SEC.
* For negative values only the tv_sec field is negative !
*/
Reproducer, with /tmp as the local filesystem folder exported as [test]
in ksmbd.conf and /mnt as the smb folder mounted with mount -t cifs:
mount -t cifs //127.0.0.1/test /mnt -o username=user,password=pass
touch /mnt/test.txt
touch -d "1969-07-20 20:17:40.123456789" /mnt/test.txt
stat -c "Server local (/tmp): %y" /tmp/test.txt
stat -c "CIFS client (/mnt): %y" /mnt/test.txt --cached=never
smbclient //127.0.0.1/test -U user%pass -c "allinfo test.txt"
which prints (stat output is garbled because of negative value):
Server local (/tmp): 1969-07-20 20:17:41.()*+,--00 +0000
CIFS client (/mnt): 1969-07-20 20:17:45.+(/+)*/00 +0000
altname: TESTT~K6.TXT
[...]
access_time: Sun Jul 20 20:17:44 1969 UTC
write_time: Sun Jul 20 20:17:44 1969 UTC
[...]
Fix this by using set_normalized_timespec64() in ksmbd_NTtimeToUnix().
Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
Cc: stable@vger.kernel.org
Assisted-by: Gemini:3.8-flash-high antigravity-cli-1.5.3
Signed-off-by: koraynilay <koray.fra@gmail.com>
---
Yet another small fix I found while implementing ptime[1].
(Still not the last one :c)
Thanks.
[1]: https://lore.kernel.org/all/20261101015551.786044-1-koray.fra@gmail.com/T/#t
fs/smb/server/misc.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/fs/smb/server/misc.c b/fs/smb/server/misc.c
index 5037f37c9226..94781246b4d6 100644
--- a/fs/smb/server/misc.c
+++ b/fs/smb/server/misc.c
@@ -336,8 +336,7 @@ struct timespec64 ksmbd_NTtimeToUnix(__le64 ntutc)
if (t < 0) {
abs_t = -t;
ts.tv_nsec = do_div(abs_t, 10000000) * 100;
- ts.tv_nsec = -ts.tv_nsec;
- ts.tv_sec = -abs_t;
+ set_normalized_timespec64(&ts, -abs_t, -ts.tv_nsec);
} else {
abs_t = t;
ts.tv_nsec = do_div(abs_t, 10000000) * 100;
base-commit: f4692d0e3b5e16d32d4ec7b1e0e58d7dbe74aaf4
--
2.56.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] cifs: fix negative timestamps being read from smb
2026-11-12 11:16 [PATCH 1/2] ksmbd: fix negative timestamps being saved to disk koraynilay
@ 2026-11-12 11:16 ` koraynilay
2026-11-12 18:27 ` [PATCH 1/2] ksmbd: fix negative timestamps being saved to disk Ian Bridges
1 sibling, 0 replies; 3+ messages in thread
From: koraynilay @ 2026-11-12 11:16 UTC (permalink / raw)
To: Namjae Jeon, Paulo Alcantara
Cc: Sergey Senozhatsky, Tom Talpey, ChenXiaoSong, Hyunchul Lee,
Ronnie Sahlberg, Shyam Prasad N, Bharath SM, linux-cifs,
samba-technical, linux-kernel, koraynilay, stable
When reading a timestamp before epoch 0, cifs converts it from NT format
to Unix format without normalizing it, leading to the nanoseconds field
to be used as a negative number, which leads to a garbled stat command
output.
This bug also violates a struct timespec64 invariant, as documented in
the set_normalized_timespec64() kernel-doc:
[...]
* Note: The tv_nsec part is always in the range of 0 <= tv_nsec < NSEC_PER_SEC.
* For negative values only the tv_sec field is negative !
*/
Reproducer, with /tmp as the local filesystem folder exported as [test]
in ksmbd.conf and /mnt as the smb folder mounted with mount -t cifs:
mount -t cifs //127.0.0.1/test /mnt -o username=user,password=pass
touch -d "1969-07-20 20:17:40.123456789" /tmp/test.txt
stat -c "Server local (/tmp): %y" /tmp/test.txt
stat -c "CIFS client (/mnt): %y" /mnt/test.txt --cached=never
smbclient //127.0.0.1/test -U user%pass -c "allinfo test.txt"
which prints (stat output is garbled because of negative value):
Server local (/tmp): 1969-07-20 20:17:40.123456789 +0000
CIFS client (/mnt): 1969-07-20 20:17:41.()*+,--00 +0000
altname: TESTT~K6.TXT
[...]
access_time: Sun Jul 20 20:17:40 1969 UTC
write_time: Sun Jul 20 20:17:40 1969 UTC
[...]
Fix this by using set_normalized_timespec64() in cifs_NTtimeToUnix().
Fixes: 2ae83bf93882 ("[CIFS] Fix setting time before epoch (negative time values)")
Cc: stable@vger.kernel.org
Assisted-by: Gemini:3.8-flash-high antigravity-cli-1.5.3
Signed-off-by: koraynilay <koray.fra@gmail.com>
---
Yet another small fix I found while implementing ptime[1].
(Still not the last one :c)
Thanks.
[1]: https://lore.kernel.org/all/20261101015551.786044-1-koray.fra@gmail.com/T/#t
fs/smb/client/netmisc.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/fs/smb/client/netmisc.c b/fs/smb/client/netmisc.c
index cf737ede1ab3..033ca8f7e151 100644
--- a/fs/smb/client/netmisc.c
+++ b/fs/smb/client/netmisc.c
@@ -133,8 +133,7 @@ cifs_NTtimeToUnix(__le64 ntutc)
if (t < 0) {
abs_t = -t;
ts.tv_nsec = (time64_t)(do_div(abs_t, 10000000) * 100);
- ts.tv_nsec = -ts.tv_nsec;
- ts.tv_sec = -abs_t;
+ set_normalized_timespec64(&ts, -abs_t, -ts.tv_nsec);
} else {
abs_t = t;
ts.tv_nsec = (time64_t)do_div(abs_t, 10000000) * 100;
base-commit: f4692d0e3b5e16d32d4ec7b1e0e58d7dbe74aaf4
--
2.56.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 1/2] ksmbd: fix negative timestamps being saved to disk
2026-11-12 11:16 [PATCH 1/2] ksmbd: fix negative timestamps being saved to disk koraynilay
2026-11-12 11:16 ` [PATCH 2/2] cifs: fix negative timestamps being read from smb koraynilay
@ 2026-11-12 18:27 ` Ian Bridges
1 sibling, 0 replies; 3+ messages in thread
From: Ian Bridges @ 2026-11-12 18:27 UTC (permalink / raw)
To: koray.fra
Cc: linkinjeon, pc, senozhatsky, tom, chenxiaosong, hyc.lee,
ronniesahlberg, sprasad, bharathsm, linux-cifs, samba-technical,
linux-kernel, stable, Ian Bridges
Hi,
On Thu, Nov 12, 2026 at 12:16:36PM +0100, koraynilay wrote:
> When setting a timestamp before epoch 0, ksmbd converts it from NT
> format to Unix format without normalizing it, leading to the nanoseconds
> field to be saved (on-disk too) as a negative number, which leads to a
> garbled stat command output and a reported +4 seconds in the timestamp.
I tested this with the ksmbd code from ksmbd-for-next. Before the
patch, setting an access or write time before 1970 with a fraction of
a second stored the wrong time on disk. The stored time was about four
seconds late, stat showed garbage for the fraction, and a query over
SMB returned the wrong time too. With the patch, the time on disk and
the time returned over SMB match the time that was set. Times after
1970, and whole seconds before it, behave as before. smbtorture gives
the same results as without the patch, and KASAN reports nothing.
Reviewed-by: Ian Bridges <icb@fastmail.org>
Tested-by: Ian Bridges <icb@fastmail.org>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-11-12 18:27 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-12 11:16 [PATCH 1/2] ksmbd: fix negative timestamps being saved to disk koraynilay
2026-11-12 11:16 ` [PATCH 2/2] cifs: fix negative timestamps being read from smb koraynilay
2026-11-12 18:27 ` [PATCH 1/2] ksmbd: fix negative timestamps being saved to disk Ian Bridges
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®