Linux NFS development
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@kernel.org>
To: Chuck Lever <cel@kernel.org>, NeilBrown <neil@brown.name>,
	 Olga Kornievskaia <okorniev@redhat.com>,
	Dai Ngo <Dai.Ngo@oracle.com>,  Tom Talpey <tom@talpey.com>
Cc: Chris Mason <clm@meta.com>,
	linux-nfs@vger.kernel.org,  linux-kernel@vger.kernel.org,
	Jeff Layton <jlayton@kernel.org>
Subject: [PATCH v2 07/21] nfsd: validate nseconds in TIME_DELEG decode paths
Date: Thu, 11 Jun 2026 16:00:50 -0400	[thread overview]
Message-ID: <20260611-nfsd-testing-v2-7-5b90e276f2d9@kernel.org> (raw)
In-Reply-To: <20260611-nfsd-testing-v2-0-5b90e276f2d9@kernel.org>

The xdrgen-based TIME_DELEG_ACCESS and TIME_DELEG_MODIFY decode arms
store a raw uint32_t nseconds directly into tv_nsec without enforcing
nseconds < NSEC_PER_SEC. The legacy nfsd4_decode_nfstime4 has this
check but the TIME_DELEG paths do not. A malformed timespec can
propagate through notify_change() to disk.

Add range checks in both nfs4xdr.c (SETATTR path) and
nfs4callback.c (CB_GETATTR path).

Fixes: 6ae30d6eb26b ("nfsd: add support for delegated timestamps")
Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Jeff Layton <jlayton@kernel.org>
---
 fs/nfsd/nfs4callback.c | 4 ++++
 fs/nfsd/nfs4xdr.c      | 4 ++++
 2 files changed, 8 insertions(+)

diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index 1628bb9ef9dd..7c868afc329e 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -108,6 +108,8 @@ static int decode_cb_fattr4(struct xdr_stream *xdr, uint32_t *bitmap,
 
 		if (!xdrgen_decode_fattr4_time_deleg_access(xdr, &access))
 			return -EIO;
+		if (access.nseconds >= NSEC_PER_SEC)
+			return -EIO;
 		fattr->ncf_cb_atime.tv_sec = access.seconds;
 		fattr->ncf_cb_atime.tv_nsec = access.nseconds;
 
@@ -117,6 +119,8 @@ static int decode_cb_fattr4(struct xdr_stream *xdr, uint32_t *bitmap,
 
 		if (!xdrgen_decode_fattr4_time_deleg_modify(xdr, &modify))
 			return -EIO;
+		if (modify.nseconds >= NSEC_PER_SEC)
+			return -EIO;
 		fattr->ncf_cb_mtime.tv_sec = modify.seconds;
 		fattr->ncf_cb_mtime.tv_nsec = modify.nseconds;
 
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 1e4a51926910..056a8df3fd50 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -637,6 +637,8 @@ nfsd4_decode_fattr4(struct nfsd4_compoundargs *argp, u32 *bmval, u32 bmlen,
 
 		if (!xdrgen_decode_fattr4_time_deleg_access(argp->xdr, &access))
 			return nfserr_bad_xdr;
+		if (access.nseconds >= NSEC_PER_SEC)
+			return nfserr_inval;
 		iattr->ia_atime.tv_sec = access.seconds;
 		iattr->ia_atime.tv_nsec = access.nseconds;
 		iattr->ia_valid |= ATTR_ATIME | ATTR_ATIME_SET | ATTR_DELEG;
@@ -646,6 +648,8 @@ nfsd4_decode_fattr4(struct nfsd4_compoundargs *argp, u32 *bmval, u32 bmlen,
 
 		if (!xdrgen_decode_fattr4_time_deleg_modify(argp->xdr, &modify))
 			return nfserr_bad_xdr;
+		if (modify.nseconds >= NSEC_PER_SEC)
+			return nfserr_inval;
 		iattr->ia_mtime.tv_sec = modify.seconds;
 		iattr->ia_mtime.tv_nsec = modify.nseconds;
 		iattr->ia_ctime.tv_sec = modify.seconds;

-- 
2.54.0


  parent reply	other threads:[~2026-06-11 20:01 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-11 20:00 [PATCH v2 00/21] nfsd: more bugfixes Jeff Layton
2026-06-11 20:00 ` [PATCH v2 01/21] nfsd: clear opcnt on compound arg release to prevent OOB read Jeff Layton
2026-06-11 20:00 ` [PATCH v2 02/21] nfsd: add missing read barrier to rpc_status_get dumpit seqcount retry Jeff Layton
2026-06-11 20:00 ` [PATCH v2 03/21] nfsd: fix netlink dumpit error handling for rpc_status_get Jeff Layton
2026-06-11 20:00 ` [PATCH v2 04/21] sunrpc: defer rq_argp and rq_resp free until after RCU grace period Jeff Layton
2026-06-11 20:00 ` [PATCH v2 05/21] nfsd: check nfsd4_acl_to_attr() return value in nfsd4_create() Jeff Layton
2026-06-11 20:00 ` [PATCH v2 06/21] nfsd: add filehandle match check to nfsd4_delegreturn() Jeff Layton
2026-06-11 20:00 ` Jeff Layton [this message]
2026-06-11 20:00 ` [PATCH v2 08/21] nfsd: remove premature NFS4_OO_CONFIRMED in CLAIM_PREVIOUS path Jeff Layton
2026-06-12 13:36   ` Jeff Layton
2026-06-11 20:00 ` [PATCH v2 09/21] nfsd: fix version mismatch loops in nfsd_acl_init_request() Jeff Layton
2026-06-11 20:00 ` [PATCH v2 10/21] nfsd: fix FL_SLEEP being set unconditionally for all LOCK types Jeff Layton
2026-06-11 20:00 ` [PATCH v2 11/21] nfsd: add fh_want_write() for early-verified SETATTR in nfsd_proc_setattr() Jeff Layton
2026-06-11 20:00 ` [PATCH v2 12/21] nfsd: fix clock domain mismatch in clients_still_reclaiming() Jeff Layton
2026-06-11 20:00 ` [PATCH v2 13/21] nfsd: use test_and_clear_bit for somebody_reclaimed to prevent lost update Jeff Layton
2026-06-11 20:00 ` [PATCH v2 14/21] nfsd: reject reclaim LOCK after RECLAIM_COMPLETE Jeff Layton
2026-06-11 20:00 ` [PATCH v2 15/21] nfsd: validate sockaddr length per family in listener_set Jeff Layton
2026-06-12 13:37   ` Jeff Layton
2026-06-11 20:00 ` [PATCH v2 16/21] lockd, nfsd: RCU-protect nlmsvc_ops dispatch Jeff Layton
2026-06-11 20:01 ` [PATCH v2 17/21] nfsd: move nfsd_debugfs_init() after nfsd4_init_slabs() in init_nfsd() Jeff Layton
2026-06-11 20:01 ` [PATCH v2 18/21] nfsd: initialize DRC hash table before registering shrinker Jeff Layton
2026-06-11 20:01 ` [PATCH v2 19/21] nfsd: restore rq_status_counter to even on all nfsd_dispatch() exit paths Jeff Layton
2026-06-11 20:01 ` [PATCH v2 20/21] nfsd: reset thread skip index when advancing pools in rpc_status dumpit Jeff Layton
2026-06-11 20:01 ` [PATCH v2 21/21] nfsd: drop the stateid, not the stateowner, on seqid_op replay retry Jeff Layton
2026-06-13 20:30 ` [PATCH v2 00/21] nfsd: more bugfixes Chuck Lever

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=20260611-nfsd-testing-v2-7-5b90e276f2d9@kernel.org \
    --to=jlayton@kernel.org \
    --cc=Dai.Ngo@oracle.com \
    --cc=cel@kernel.org \
    --cc=clm@meta.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=neil@brown.name \
    --cc=okorniev@redhat.com \
    --cc=tom@talpey.com \
    /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