]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
NFSD: Fix permission check for read access to executable-only files
authorScott Mayhew <smayhew@redhat.com>
Thu, 11 Dec 2025 12:34:34 +0000 (07:34 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 17 Jan 2026 15:31:14 +0000 (16:31 +0100)
commit e901c7fce59e72d9f3c92733c379849c4034ac50 upstream.

Commit abc02e5602f7 ("NFSD: Support write delegations in LAYOUTGET")
added NFSD_MAY_OWNER_OVERRIDE to the access flags passed from
nfsd4_layoutget() to fh_verify().  This causes LAYOUTGET to fail for
executable-only files, and causes xfstests generic/126 to fail on
pNFS SCSI.

To allow read access to executable-only files, what we really want is:
1. The "permissions" portion of the access flags (the lower 6 bits)
   must be exactly NFSD_MAY_READ
2. The "hints" portion of the access flags (the upper 26 bits) can
   contain any combination of NFSD_MAY_OWNER_OVERRIDE and
   NFSD_MAY_READ_IF_EXEC

Fixes: abc02e5602f7 ("NFSD: Support write delegations in LAYOUTGET")
Cc: stable@vger.kernel.org # v6.6+
Signed-off-by: Scott Mayhew <smayhew@redhat.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: NeilBrown <neil@brown.name>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/nfsd/vfs.c

index 8c4f4e2f9cee0be4ad33861d95676ae626dc1d62..08c8babfdd75890a9b30129b0a8ec914949eba0f 100644 (file)
@@ -2568,8 +2568,8 @@ nfsd_permission(struct svc_cred *cred, struct svc_export *exp,
 
        /* Allow read access to binaries even when mode 111 */
        if (err == -EACCES && S_ISREG(inode->i_mode) &&
-            (acc == (NFSD_MAY_READ | NFSD_MAY_OWNER_OVERRIDE) ||
-             acc == (NFSD_MAY_READ | NFSD_MAY_READ_IF_EXEC)))
+            (((acc & NFSD_MAY_MASK) == NFSD_MAY_READ) &&
+             (acc & (NFSD_MAY_OWNER_OVERRIDE | NFSD_MAY_READ_IF_EXEC))))
                err = inode_permission(&nop_mnt_idmap, inode, MAY_EXEC);
 
        return err? nfserrno(err) : 0;