<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    On 12/16/2011 05:46 AM, Herton Ronaldo Krzesinski wrote:
    <blockquote cite="mid:20111216114641.GA2536@herton-Z68MA-D2H-B3"
      type="cite">
      <pre wrap="">On Thu, Dec 15, 2011 at 02:31:34PM -0600, Chris J Arges wrote:
</pre>
      <blockquote type="cite">
        <pre wrap="">SRU Justification

Impact:

NFSv4 mount point does not allow binary files to run when permissions
are set to 111.

Fix:

Upstream commit a043226bc140a2c1dde162246d68a67e5043e6b2.
Applies with minor conflicts (include file is in a different directory).

Testcase:
Mount a directory using nfsv4. Inside that directory place a binary with
---x--x--x permissions. Try to execute the binary. Without this patch it
will not execute.

Notes:
This patch fixes this issue, but requires support from the nfs client as
well. The Lucid version of the client works as expected.

Thanks,
--chris j arges
</pre>
      </blockquote>
      <pre wrap="">
</pre>
      <blockquote type="cite">
        <pre wrap="">From 88c0bdee31a467bb55a3f812b6ae63dae4330a79 Mon Sep 17 00:00:00 2001
From: "J. Bruce Fields" <a class="moz-txt-link-rfc2396E" href="mailto:bfields@redhat.com"><bfields@redhat.com></a>
Date: Thu, 25 Aug 2011 10:48:39 -0400
Subject: [PATCH] nfsd4: permit read opens of executable-only files

A client that wants to execute a file must be able to read it.  Read
opens over nfs are therefore implicitly allowed for executable files
even when those files are not readable.

NFSv2/v3 get this right by using a passed-in NFSD_MAY_OWNER_OVERRIDE on
read requests, but NFSv4 has gotten this wrong ever since
dc730e173785e29b297aa605786c94adaffe2544 "nfsd4: fix owner-override on
open", when we realized that the file owner shouldn't override
permissions on non-reclaim NFSv4 opens.

So we can't use NFSD_MAY_OWNER_OVERRIDE to tell nfsd_permission to allow
reads of executable files.

So, do the same thing we do whenever we encounter another weird NFS
permission nit: define yet another NFSD_MAY_* flag.

The industry's future standardization on 128-bit processors will be
motivated primarily by the need for integers with enough bits for all
the NFSD_MAY_* flags.

Reported-by: Leonardo Borda <a class="moz-txt-link-rfc2396E" href="mailto:leonardoborda@gmail.com"><leonardoborda@gmail.com></a>
Cc: <a class="moz-txt-link-abbreviated" href="mailto:stable@kernel.org">stable@kernel.org</a>
Signed-off-by: J. Bruce Fields <a class="moz-txt-link-rfc2396E" href="mailto:bfields@redhat.com"><bfields@redhat.com></a>
(cherry picked from commit a043226bc140a2c1dde162246d68a67e5043e6b2)

BugLink: <a class="moz-txt-link-freetext" href="http://bugs.launchpad.net/bugs/833300">http://bugs.launchpad.net/bugs/833300</a>
</pre>
      </blockquote>
      <pre wrap="">
You forgot to add your Sign-off, no big problem though:

Acked-by: Herton Ronaldo Krzesinski <a class="moz-txt-link-rfc2396E" href="mailto:herton.krzesinski@canonical.com"><herton.krzesinski@canonical.com></a>

</pre>
    </blockquote>
    Thanks, added my sign off to this version of the patch.<br>
    --chris j arges<br>
    <br>
    <br>
    <blockquote cite="mid:20111216114641.GA2536@herton-Z68MA-D2H-B3"
      type="cite">
      <blockquote type="cite">
        <pre wrap="">
Conflicts:

        fs/nfsd/vfs.h
---
 fs/nfsd/nfs4proc.c        |    2 ++
 fs/nfsd/vfs.c             |    3 ++-
 include/linux/nfsd/nfsd.h |    1 +
 3 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 01d83a5..f865116 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -166,6 +166,8 @@ do_open_permission(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfs
                !(open->op_share_access & NFS4_SHARE_ACCESS_WRITE))
                return nfserr_inval;
 
+       accmode |= NFSD_MAY_READ_IF_EXEC;
+
        if (open->op_share_access & NFS4_SHARE_ACCESS_READ)
                accmode |= NFSD_MAY_READ;
        if (open->op_share_access & NFS4_SHARE_ACCESS_WRITE)
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
index 2e09588..494350b 100644
--- a/fs/nfsd/vfs.c
+++ b/fs/nfsd/vfs.c
@@ -2118,7 +2118,8 @@ nfsd_permission(struct svc_rqst *rqstp, 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_OWNER_OVERRIDE) ||
+             acc == (NFSD_MAY_READ | NFSD_MAY_READ_IF_EXEC)))
                err = inode_permission(inode, MAY_EXEC);
        if (err)
                goto nfsd_out;
diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h
index 510ffdd..3436ec6 100644
--- a/include/linux/nfsd/nfsd.h
+++ b/include/linux/nfsd/nfsd.h
@@ -38,6 +38,7 @@
 #define NFSD_MAY_OWNER_OVERRIDE        64
 #define NFSD_MAY_LOCAL_ACCESS  128 /* IRIX doing local access check on device special file*/
 #define NFSD_MAY_BYPASS_GSS_ON_ROOT 256
+#define NFSD_MAY_READ_IF_EXEC  2048
 
 #define NFSD_MAY_CREATE                (NFSD_MAY_EXEC|NFSD_MAY_WRITE)
 #define NFSD_MAY_REMOVE                (NFSD_MAY_EXEC|NFSD_MAY_WRITE|NFSD_MAY_TRUNC)
-- 
1.7.5.4

</pre>
      </blockquote>
      <pre wrap="">
</pre>
      <blockquote type="cite">
        <pre wrap="">-- 
kernel-team mailing list
<a class="moz-txt-link-abbreviated" href="mailto:kernel-team@lists.ubuntu.com">kernel-team@lists.ubuntu.com</a>
<a class="moz-txt-link-freetext" href="https://lists.ubuntu.com/mailman/listinfo/kernel-team">https://lists.ubuntu.com/mailman/listinfo/kernel-team</a>
</pre>
      </blockquote>
      <pre wrap="">
</pre>
    </blockquote>
    <br>
  </body>
</html>