diff options
Diffstat (limited to 'sys/fs/nfsserver')
| -rw-r--r-- | sys/fs/nfsserver/nfs_nfsdport.c | 11 | ||||
| -rw-r--r-- | sys/fs/nfsserver/nfs_nfsdserv.c | 17 | 
2 files changed, 23 insertions, 5 deletions
| diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c index eb6ba285f8fe..9fe3f4426124 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -3193,7 +3193,8 @@ nfsv4_sattr(struct nfsrv_descript *nd, vnode_t vp, struct nfsvattr *nvap,  		bitpos = NFSATTRBIT_MAX;  	} else {  		bitpos = 0; -		if (NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_HIDDEN) || +		if (NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_ARCHIVE) || +		    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_HIDDEN) ||  		    NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_SYSTEM))  			nvap->na_flags = 0;  	} @@ -3226,9 +3227,11 @@ nfsv4_sattr(struct nfsrv_descript *nd, vnode_t vp, struct nfsvattr *nvap,  			attrsum += aclsize;  			break;  		case NFSATTRBIT_ARCHIVE: -			NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED); -			if (!nd->nd_repstat) -				nd->nd_repstat = NFSERR_ATTRNOTSUPP; +			NFSM_DISSECT(tl, uint32_t *, NFSX_UNSIGNED); +			if (nd->nd_repstat == 0) { +				if (*tl == newnfs_true) +					nvap->na_flags |= UF_ARCHIVE; +			}  			attrsum += NFSX_UNSIGNED;  			break;  		case NFSATTRBIT_HIDDEN: diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c index 921ea4887af1..67af0cf71175 100644 --- a/sys/fs/nfsserver/nfs_nfsdserv.c +++ b/sys/fs/nfsserver/nfs_nfsdserv.c @@ -436,6 +436,7 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,  	/* For NFSv4, only va_uid and va_flags is used from nva2. */  	NFSSETBIT_ATTRBIT(&retbits, NFSATTRBIT_OWNER); +	NFSSETBIT_ATTRBIT(&retbits, NFSATTRBIT_ARCHIVE);  	NFSSETBIT_ATTRBIT(&retbits, NFSATTRBIT_HIDDEN);  	NFSSETBIT_ATTRBIT(&retbits, NFSATTRBIT_SYSTEM);  	preat_ret = nfsvno_getattr(vp, &nva2, nd, p, 1, &retbits); @@ -569,8 +570,15 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,  		}  	    }  	    if (!nd->nd_repstat && -		(NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_HIDDEN) || +		(NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_ARCHIVE) || +		 NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_HIDDEN) ||  		 NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_SYSTEM))) { +		if (NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_ARCHIVE)) { +		    if ((nva.na_flags & UF_ARCHIVE) != 0) +			oldflags |= UF_ARCHIVE; +		    else +			oldflags &= ~UF_ARCHIVE; +		}  		if (NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_HIDDEN)) {  		    if ((nva.na_flags & UF_HIDDEN) != 0)  			oldflags |= UF_HIDDEN; @@ -588,6 +596,8 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,  		nd->nd_repstat = nfsvno_setattr(vp, &nva2, nd->nd_cred, p,  		    exp);  		if (!nd->nd_repstat) { +		    if (NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_ARCHIVE)) +			NFSSETBIT_ATTRBIT(&retbits, NFSATTRBIT_ARCHIVE);  		    if (NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_HIDDEN))  			NFSSETBIT_ATTRBIT(&retbits, NFSATTRBIT_HIDDEN);  		    if (NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_SYSTEM)) @@ -5128,6 +5138,11 @@ nfsrvd_layoutcommit(struct nfsrv_descript *nd, __unused int isdgram,  		NFSM_DISSECT(tl, uint32_t *, 2 * NFSX_UNSIGNED);  	layouttype = fxdr_unsigned(int, *tl++);  	maxcnt = fxdr_unsigned(int, *tl); +	/* There is no limit in the RFC, so use 1000 as a sanity limit. */ +	if (maxcnt < 0 || maxcnt > 1000) { +		error = NFSERR_BADXDR; +		goto nfsmout; +	}  	if (maxcnt > 0) {  		layp = malloc(maxcnt + 1, M_TEMP, M_WAITOK);  		error = nfsrv_mtostr(nd, layp, maxcnt); | 
