summaryrefslogtreecommitdiffstats
path: root/sys/fs/nfsserver
diff options
context:
space:
mode:
authorrmacklem <rmacklem@FreeBSD.org>2011-06-21 19:58:29 +0000
committerrmacklem <rmacklem@FreeBSD.org>2011-06-21 19:58:29 +0000
commitaf32f8cb559748adc106e1e2e118109231eb6954 (patch)
tree03414c9b2452fe056d47c5ce5c7424fcfa0eaa27 /sys/fs/nfsserver
parent2df9331d12f7b78278e2828898debc4238212f5c (diff)
downloadFreeBSD-src-af32f8cb559748adc106e1e2e118109231eb6954.zip
FreeBSD-src-af32f8cb559748adc106e1e2e118109231eb6954.tar.gz
Fix the new NFSv4 server so that it checks for VREAD_ACL when
a client does a Getattr for an ACL and not VREAD_ATTRIBUTES. This was found during the recent NFSv4 interoperability Bakeathon. MFC after: 2 weeks
Diffstat (limited to 'sys/fs/nfsserver')
-rw-r--r--sys/fs/nfsserver/nfs_nfsdserv.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c
index fc296c0..64aafb4 100644
--- a/sys/fs/nfsserver/nfs_nfsdserv.c
+++ b/sys/fs/nfsserver/nfs_nfsdserv.c
@@ -172,11 +172,12 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
fhandle_t fh;
int at_root = 0, error = 0, supports_nfsv4acls;
struct nfsreferral *refp;
- nfsattrbit_t attrbits;
+ nfsattrbit_t attrbits, tmpbits;
struct mount *mp;
struct vnode *tvp = NULL;
struct vattr va;
uint64_t mounted_on_fileno = 0;
+ accmode_t accmode;
if (nd->nd_repstat)
return (0);
@@ -197,11 +198,20 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
vput(vp);
return (0);
}
- if (!nd->nd_repstat)
- nd->nd_repstat = nfsvno_accchk(vp,
- VREAD_ATTRIBUTES,
- nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE,
- NFSACCCHK_VPISLOCKED, NULL);
+ if (nd->nd_repstat == 0) {
+ accmode = 0;
+ NFSSET_ATTRBIT(&tmpbits, &attrbits);
+ if (NFSISSET_ATTRBIT(&tmpbits, NFSATTRBIT_ACL)) {
+ NFSCLRBIT_ATTRBIT(&tmpbits, NFSATTRBIT_ACL);
+ accmode |= VREAD_ACL;
+ }
+ if (NFSNONZERO_ATTRBIT(&tmpbits))
+ accmode |= VREAD_ATTRIBUTES;
+ if (accmode != 0)
+ nd->nd_repstat = nfsvno_accchk(vp, accmode,
+ nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE,
+ NFSACCCHK_VPISLOCKED, NULL);
+ }
}
if (!nd->nd_repstat)
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
OpenPOWER on IntegriCloud