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
This commit is contained in:
parent
2df9331d12
commit
af32f8cb55
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user