diff options
Diffstat (limited to 'fs/nfs/callback_xdr.c')
| -rw-r--r-- | fs/nfs/callback_xdr.c | 18 | 
1 files changed, 9 insertions, 9 deletions
| diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c index a67c41ec545f..f90de8043b0f 100644 --- a/fs/nfs/callback_xdr.c +++ b/fs/nfs/callback_xdr.c @@ -258,11 +258,9 @@ __be32 decode_devicenotify_args(struct svc_rqst *rqstp,  				void *argp)  {  	struct cb_devicenotifyargs *args = argp; +	uint32_t tmp, n, i;  	__be32 *p;  	__be32 status = 0; -	u32 tmp; -	int n, i; -	args->ndevs = 0;  	/* Num of device notifications */  	p = xdr_inline_decode(xdr, sizeof(uint32_t)); @@ -271,7 +269,7 @@ __be32 decode_devicenotify_args(struct svc_rqst *rqstp,  		goto out;  	}  	n = ntohl(*p++); -	if (n <= 0) +	if (n == 0)  		goto out;  	if (n > ULONG_MAX / sizeof(*args->devs)) {  		status = htonl(NFS4ERR_BADXDR); @@ -330,19 +328,21 @@ __be32 decode_devicenotify_args(struct svc_rqst *rqstp,  			dev->cbd_immediate = 0;  		} -		args->ndevs++; -  		dprintk("%s: type %d layout 0x%x immediate %d\n",  			__func__, dev->cbd_notify_type, dev->cbd_layout_type,  			dev->cbd_immediate);  	} +	args->ndevs = n; +	dprintk("%s: ndevs %d\n", __func__, args->ndevs); +	return 0; +err: +	kfree(args->devs);  out: +	args->devs = NULL; +	args->ndevs = 0;  	dprintk("%s: status %d ndevs %d\n",  		__func__, ntohl(status), args->ndevs);  	return status; -err: -	kfree(args->devs); -	goto out;  }  static __be32 decode_sessionid(struct xdr_stream *xdr, |