sunrpc: fix refcount leak for rpc auth modules
commit f1442d6349a2e7bb7a6134791bdc26cb776c79af upstream.
If an auth module's accept op returns SVC_CLOSE, svc_process_common()
enters a call path that does not call svc_authorise() before leaving the
function, and thus leaks a reference on the auth module's refcount. Hence,
make sure calls to svc_authenticate() and svc_authorise() are paired for
all call paths, to make sure rpc auth modules can be unloaded.
Signed-off-by: Daniel Kobras <kobras@puzzle-itc.de>
Fixes: 4d712ef1db
("svcauth_gss: Close connection when dropping an incoming message")
Link: https://lore.kernel.org/linux-nfs/3F1B347F-B809-478F-A1E9-0BE98E22B0F0@oracle.com/T/#t
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
3c57ea0936
commit
f0b09d5477
|
@ -1417,7 +1417,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
||||||
|
|
||||||
sendit:
|
sendit:
|
||||||
if (svc_authorise(rqstp))
|
if (svc_authorise(rqstp))
|
||||||
goto close;
|
goto close_xprt;
|
||||||
return 1; /* Caller can now send it */
|
return 1; /* Caller can now send it */
|
||||||
|
|
||||||
release_dropit:
|
release_dropit:
|
||||||
|
@ -1429,6 +1429,8 @@ release_dropit:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
close:
|
close:
|
||||||
|
svc_authorise(rqstp);
|
||||||
|
close_xprt:
|
||||||
if (rqstp->rq_xprt && test_bit(XPT_TEMP, &rqstp->rq_xprt->xpt_flags))
|
if (rqstp->rq_xprt && test_bit(XPT_TEMP, &rqstp->rq_xprt->xpt_flags))
|
||||||
svc_close_xprt(rqstp->rq_xprt);
|
svc_close_xprt(rqstp->rq_xprt);
|
||||||
dprintk("svc: svc_process close\n");
|
dprintk("svc: svc_process close\n");
|
||||||
|
@ -1437,7 +1439,7 @@ release_dropit:
|
||||||
err_short_len:
|
err_short_len:
|
||||||
svc_printk(rqstp, "short len %zd, dropping request\n",
|
svc_printk(rqstp, "short len %zd, dropping request\n",
|
||||||
argv->iov_len);
|
argv->iov_len);
|
||||||
goto close;
|
goto close_xprt;
|
||||||
|
|
||||||
err_bad_rpc:
|
err_bad_rpc:
|
||||||
serv->sv_stats->rpcbadfmt++;
|
serv->sv_stats->rpcbadfmt++;
|
||||||
|
|
Loading…
Reference in New Issue