]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
NFSv4: include MAY_WRITE in open permission mask for O_TRUNC
authorBenjamin Coddington <ben.coddington@hammerspace.com>
Thu, 11 Jun 2026 21:02:15 +0000 (17:02 -0400)
committerAnna Schumaker <anna.schumaker@hammerspace.com>
Wed, 8 Jul 2026 18:42:02 +0000 (14:42 -0400)
POSIX requires write permission to truncate a file, so an open() that
specifies O_TRUNC must be authorized for write access regardless of the
O_ACCMODE access mode.

nfs_open_permission_mask() builds the access mask passed to
nfs_may_open(), which is the local authorization gate for OPENs the
client serves itself from a cached write delegation via the
can_open_delegated() path in nfs4_try_open_cached().  The mask is
derived from O_ACCMODE alone, so an open(O_RDONLY | O_TRUNC) against a
file the caller cannot write requests only MAY_READ and passes the
local check.  The OPEN is then satisfied locally and the truncation is
issued to the server as a SETATTR(size=0) over the delegation stateid,
which the server accepts under standard write-delegation semantics.
POSIX requires that this open fail with EACCES.

Include MAY_WRITE in the mask whenever O_TRUNC is set so the local
check matches the access the server would have enforced.

Suggested-by: Trond Myklebust <trondmy@kernel.org>
Fixes: af22f94ae02a ("NFSv4: Simplify _nfs4_do_access()")
Cc: stable@vger.kernel.org
Signed-off-by: Benjamin Coddington <bcodding@hammerspace.com>
Signed-off-by: Anna Schumaker <anna.schumaker@hammerspace.com>
fs/nfs/dir.c

index c7b723c18620c9fd096bd781a67842c73bc814bd..c7caffb31935c7d989b84c021dacc9f8344c2cf4 100644 (file)
@@ -3346,6 +3346,8 @@ static int nfs_open_permission_mask(int openflags)
                        mask |= MAY_READ;
                if ((openflags & O_ACCMODE) != O_RDONLY)
                        mask |= MAY_WRITE;
+               if (openflags & O_TRUNC)
+                       mask |= MAY_WRITE;
        }
 
        return mask;