diff options
Diffstat (limited to 'fs/nfsd/nfs4xdr.c')
| -rw-r--r-- | fs/nfsd/nfs4xdr.c | 21 | 
1 files changed, 14 insertions, 7 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index c0a3c6a7c8bb..6040a6145dad 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -2488,8 +2488,10 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)  	if (xdr_stream_decode_u32(argp->xdr, &argp->minorversion) < 0)  		return false; -	if (xdr_stream_decode_u32(argp->xdr, &argp->opcnt) < 0) +	if (xdr_stream_decode_u32(argp->xdr, &argp->client_opcnt) < 0)  		return false; +	argp->opcnt = min_t(u32, argp->client_opcnt, +			    NFSD_MAX_OPS_PER_COMPOUND);  	if (argp->opcnt > ARRAY_SIZE(argp->iops)) {  		argp->ops = vcalloc(argp->opcnt, sizeof(*argp->ops)); @@ -2628,10 +2630,8 @@ static __be32 nfsd4_encode_components_esc(struct xdr_stream *xdr, char sep,  	__be32 *p;  	__be32 pathlen;  	int pathlen_offset; -	int strlen, count=0;  	char *str, *end, *next; - -	dprintk("nfsd4_encode_components(%s)\n", components); +	int count = 0;  	pathlen_offset = xdr->buf->len;  	p = xdr_reserve_space(xdr, 4); @@ -2658,9 +2658,8 @@ static __be32 nfsd4_encode_components_esc(struct xdr_stream *xdr, char sep,  			for (; *end && (*end != sep); end++)  				/* find sep or end of string */; -		strlen = end - str; -		if (strlen) { -			if (xdr_stream_encode_opaque(xdr, str, strlen) < 0) +		if (end > str) { +			if (xdr_stream_encode_opaque(xdr, str, end - str) < 0)  				return nfserr_resource;  			count++;  		} else @@ -2939,6 +2938,12 @@ struct nfsd4_fattr_args {  typedef __be32(*nfsd4_enc_attr)(struct xdr_stream *xdr,  				const struct nfsd4_fattr_args *args); +static __be32 nfsd4_encode_fattr4__inval(struct xdr_stream *xdr, +					 const struct nfsd4_fattr_args *args) +{ +	return nfserr_inval; +} +  static __be32 nfsd4_encode_fattr4__noop(struct xdr_stream *xdr,  					const struct nfsd4_fattr_args *args)  { @@ -3560,6 +3565,8 @@ static const nfsd4_enc_attr nfsd4_enc_fattr4_encode_ops[] = {  	[FATTR4_MODE_UMASK]		= nfsd4_encode_fattr4__noop,  	[FATTR4_XATTR_SUPPORT]		= nfsd4_encode_fattr4_xattr_support, +	[FATTR4_TIME_DELEG_ACCESS]	= nfsd4_encode_fattr4__inval, +	[FATTR4_TIME_DELEG_MODIFY]	= nfsd4_encode_fattr4__inval,  	[FATTR4_OPEN_ARGUMENTS]		= nfsd4_encode_fattr4_open_arguments,  };  | 
