diff options
Diffstat (limited to 'sys/fs/nfsserver/nfs_nfsdsubs.c')
-rw-r--r-- | sys/fs/nfsserver/nfs_nfsdsubs.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/sys/fs/nfsserver/nfs_nfsdsubs.c b/sys/fs/nfsserver/nfs_nfsdsubs.c index 0d7e4c73fe69..b09ec1b3a062 100644 --- a/sys/fs/nfsserver/nfs_nfsdsubs.c +++ b/sys/fs/nfsserver/nfs_nfsdsubs.c @@ -57,9 +57,6 @@ NFSD_VNET_DECLARE(int, nfs_rootfhset); NFSD_VNET_DECLARE(uid_t, nfsrv_defaultuid); NFSD_VNET_DECLARE(gid_t, nfsrv_defaultgid); -NFSD_VNET_DEFINE(struct nfsdontlisthead, nfsrv_dontlisthead); - - char nfs_v2pubfh[NFSX_V2FH]; struct nfsdontlisthead nfsrv_dontlisthead; struct nfslayouthead nfsrv_recalllisthead; @@ -1476,8 +1473,9 @@ int nfsrv_mtofh(struct nfsrv_descript *nd, struct nfsrvfh *fhp) { u_int32_t *tl; - int error = 0, len, copylen; + int error = 0, len, copylen, namedlen; + namedlen = 0; if (nd->nd_flag & (ND_NFSV3 | ND_NFSV4)) { NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED); len = fxdr_unsigned(int, *tl); @@ -1493,6 +1491,11 @@ nfsrv_mtofh(struct nfsrv_descript *nd, struct nfsrvfh *fhp) copylen = NFSX_MYFH; len = NFSM_RNDUP(len); nd->nd_flag |= ND_DSSERVER; + } else if (len >= NFSX_MYFH + NFSX_V4NAMEDDIRFH && + len <= NFSX_MYFH + NFSX_V4NAMEDATTRFH) { + copylen = NFSX_MYFH; + namedlen = len; + len = NFSM_RNDUP(len); } else if (len < NFSRV_MINFH || len > NFSRV_MAXFH) { if (nd->nd_flag & ND_NFSV4) { if (len > 0 && len <= NFSX_V4FHMAX) { @@ -1527,7 +1530,10 @@ nfsrv_mtofh(struct nfsrv_descript *nd, struct nfsrvfh *fhp) goto nfsmout; } NFSBCOPY(tl, (caddr_t)fhp->nfsrvfh_data, copylen); - fhp->nfsrvfh_len = copylen; + if (namedlen > 0) + fhp->nfsrvfh_len = namedlen; + else + fhp->nfsrvfh_len = copylen; nfsmout: NFSEXITCODE2(error, nd); return (error); @@ -1623,7 +1629,7 @@ nfsrv_checkuidgid(struct nfsrv_descript *nd, struct nfsvattr *nvap) if (nd->nd_cred->cr_uid == 0) goto out; if ((NFSVNO_ISSETUID(nvap) && nvap->na_uid != nd->nd_cred->cr_uid) || - (NFSVNO_ISSETGID(nvap) && nvap->na_gid != nd->nd_cred->cr_gid && + (NFSVNO_ISSETGID(nvap) && !groupmember(nvap->na_gid, nd->nd_cred))) error = NFSERR_PERM; @@ -1682,8 +1688,7 @@ nfsrv_fixattr(struct nfsrv_descript *nd, vnode_t vp, } if (NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_OWNERGROUP) && NFSVNO_ISSETGID(nvap)) { - if (nvap->na_gid == nd->nd_cred->cr_gid || - groupmember(nvap->na_gid, nd->nd_cred)) { + if (groupmember(nvap->na_gid, nd->nd_cred)) { nd->nd_cred->cr_uid = 0; nva.na_gid = nvap->na_gid; change++; |