Re: [PATCH] sunrpc: fix prog selection loop in svc_process_common

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[I fixed Dan's address - sorry about that]

On Thu, 26 Sep 2024, Chuck Lever wrote:
> Hi Neil -
> 
> On Wed, Sep 25, 2024 at 05:28:09PM +1000, NeilBrown wrote:
> > 
> > If the rq_prog is not in the list of programs, then we use the last
> > program in the list and subsequent tests on 'progp' being NULL are
> > useless.
> 
> That's the logic error, but what is the observed unexpected
> behavior?

The unexpected behaviour is that "if rq_prog is not in the list of
programs, then we use the last program in the list".  Isn't that a
behaviour?  Should I add that "we don't get the expected
rpc_prog_unavail error?
What am I missing?

> 
> 
> > We should only assign progp when we find the right program, and we
> > should initialize it to NULL
> > 
> > Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>
> > Fixes: 86ab08beb3f0 ("SUNRPC: replace program list with program array")
> > Signed-off-by: NeilBrown <neilb@xxxxxxx>
> 
> IIRC commit 86ab08beb3f0 went through Anna's tree during this merge
> window. It would be easier (for me) if Anna took this one.

I don't entirely understand the logic, but ok.

> 
> Acked-by: Chuck Lever <chuck.lever@xxxxxxxxxx>

Thanks,
NeilBrown

> 
> 
> > ---
> >  net/sunrpc/svc.c | 11 ++++-------
> >  1 file changed, 4 insertions(+), 7 deletions(-)
> > 
> > diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
> > index 7e7f4e0390c7..79879b7d39cb 100644
> > --- a/net/sunrpc/svc.c
> > +++ b/net/sunrpc/svc.c
> > @@ -1321,7 +1321,7 @@ static int
> >  svc_process_common(struct svc_rqst *rqstp)
> >  {
> >  	struct xdr_stream	*xdr = &rqstp->rq_res_stream;
> > -	struct svc_program	*progp;
> > +	struct svc_program	*progp = NULL;
> >  	const struct svc_procedure *procp = NULL;
> >  	struct svc_serv		*serv = rqstp->rq_server;
> >  	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_proc = be32_to_cpup(p);
> >  
> > -	for (pr = 0; pr < serv->sv_nprogs; pr++) {
> > -		progp = &serv->sv_programs[pr];
> > -
> > -		if (rqstp->rq_prog == progp->pg_prog)
> > -			break;
> > -	}
> > +	for (pr = 0; pr < serv->sv_nprogs; pr++)
> > +		if (rqstp->rq_prog == serv->sv_programs[pr].pg_prog)
> > +			progp = &serv->sv_programs[pr];
> >  
> >  	/*
> >  	 * Decode auth data, and add verifier to reply buffer.
> > -- 
> > 2.46.0
> > 
> 
> -- 
> Chuck Lever
> 





[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux