sunrpc: fix prog selection loop in svc_process_common
If the rq_prog is not in the list of programs, then we use the last
program in the list and we don't get the expected rpc_prog_unavail error
as the subsequent tests on 'progp' being NULL are ineffective.
We should only assign progp when we find the right program, and we
should initialize it to NULL
Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Fixes: 86ab08beb3
("SUNRPC: replace program list with program array")
Signed-off-by: NeilBrown <neilb@suse.de>
Acked-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
This commit is contained in:
parent
37578c682c
commit
1d498df44e
@ -1321,7 +1321,7 @@ static int
|
|||||||
svc_process_common(struct svc_rqst *rqstp)
|
svc_process_common(struct svc_rqst *rqstp)
|
||||||
{
|
{
|
||||||
struct xdr_stream *xdr = &rqstp->rq_res_stream;
|
struct xdr_stream *xdr = &rqstp->rq_res_stream;
|
||||||
struct svc_program *progp;
|
struct svc_program *progp = NULL;
|
||||||
const struct svc_procedure *procp = NULL;
|
const struct svc_procedure *procp = NULL;
|
||||||
struct svc_serv *serv = rqstp->rq_server;
|
struct svc_serv *serv = rqstp->rq_server;
|
||||||
struct svc_process_info process;
|
struct svc_process_info process;
|
||||||
@ -1351,12 +1351,9 @@ svc_process_common(struct svc_rqst *rqstp)
|
|||||||
rqstp->rq_vers = be32_to_cpup(p++);
|
rqstp->rq_vers = be32_to_cpup(p++);
|
||||||
rqstp->rq_proc = be32_to_cpup(p);
|
rqstp->rq_proc = be32_to_cpup(p);
|
||||||
|
|
||||||
for (pr = 0; pr < serv->sv_nprogs; pr++) {
|
for (pr = 0; pr < serv->sv_nprogs; pr++)
|
||||||
progp = &serv->sv_programs[pr];
|
if (rqstp->rq_prog == serv->sv_programs[pr].pg_prog)
|
||||||
|
progp = &serv->sv_programs[pr];
|
||||||
if (rqstp->rq_prog == progp->pg_prog)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Decode auth data, and add verifier to reply buffer.
|
* Decode auth data, and add verifier to reply buffer.
|
||||||
|
Loading…
Reference in New Issue
Block a user