diff options
Diffstat (limited to 'net/sunrpc/auth.c')
| -rw-r--r-- | net/sunrpc/auth.c | 28 | 
1 files changed, 24 insertions, 4 deletions
diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c index afe67849269..67e31276682 100644 --- a/net/sunrpc/auth.c +++ b/net/sunrpc/auth.c @@ -563,8 +563,17 @@ rpcauth_checkverf(struct rpc_task *task, __be32 *p)  	return cred->cr_ops->crvalidate(task, p);  } +static void rpcauth_wrap_req_encode(kxdreproc_t encode, struct rpc_rqst *rqstp, +				   __be32 *data, void *obj) +{ +	struct xdr_stream xdr; + +	xdr_init_encode(&xdr, &rqstp->rq_snd_buf, data); +	encode(rqstp, &xdr, obj); +} +  int -rpcauth_wrap_req(struct rpc_task *task, kxdrproc_t encode, void *rqstp, +rpcauth_wrap_req(struct rpc_task *task, kxdreproc_t encode, void *rqstp,  		__be32 *data, void *obj)  {  	struct rpc_cred *cred = task->tk_rqstp->rq_cred; @@ -574,11 +583,22 @@ rpcauth_wrap_req(struct rpc_task *task, kxdrproc_t encode, void *rqstp,  	if (cred->cr_ops->crwrap_req)  		return cred->cr_ops->crwrap_req(task, encode, rqstp, data, obj);  	/* By default, we encode the arguments normally. */ -	return encode(rqstp, data, obj); +	rpcauth_wrap_req_encode(encode, rqstp, data, obj); +	return 0; +} + +static int +rpcauth_unwrap_req_decode(kxdrdproc_t decode, struct rpc_rqst *rqstp, +			  __be32 *data, void *obj) +{ +	struct xdr_stream xdr; + +	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, data); +	return decode(rqstp, &xdr, obj);  }  int -rpcauth_unwrap_resp(struct rpc_task *task, kxdrproc_t decode, void *rqstp, +rpcauth_unwrap_resp(struct rpc_task *task, kxdrdproc_t decode, void *rqstp,  		__be32 *data, void *obj)  {  	struct rpc_cred *cred = task->tk_rqstp->rq_cred; @@ -589,7 +609,7 @@ rpcauth_unwrap_resp(struct rpc_task *task, kxdrproc_t decode, void *rqstp,  		return cred->cr_ops->crunwrap_resp(task, decode, rqstp,  						   data, obj);  	/* By default, we decode the arguments normally. */ -	return decode(rqstp, data, obj); +	return rpcauth_unwrap_req_decode(decode, rqstp, data, obj);  }  int  |