2014-05-18 18:05:24

by Trond Myklebust

[permalink] [raw]
Subject: [PATCH] SUNRPC: Fix a module reference leak in svc_handle_xprt

If the accept() call fails, we need to put the module reference.

Signed-off-by: Trond Myklebust <[email protected]>
---
net/sunrpc/svc_xprt.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
index 06c6ff0cb911..a4acaf2bcf18 100644
--- a/net/sunrpc/svc_xprt.c
+++ b/net/sunrpc/svc_xprt.c
@@ -730,6 +730,8 @@ static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt)
newxpt = xprt->xpt_ops->xpo_accept(xprt);
if (newxpt)
svc_add_new_temp_xprt(serv, newxpt);
+ else
+ module_put(xprt->xpt_class->xcl_owner);
} else if (xprt->xpt_ops->xpo_has_wspace(xprt)) {
/* XPT_DATA|XPT_DEFERRED case: */
dprintk("svc: server %p, pool %u, transport %p, inuse=%d\n",
--
1.9.0



2014-05-22 19:57:18

by J. Bruce Fields

[permalink] [raw]
Subject: Re: [PATCH] SUNRPC: Fix a module reference leak in svc_handle_xprt

On Sun, May 18, 2014 at 02:05:22PM -0400, Trond Myklebust wrote:
> If the accept() call fails, we need to put the module reference.

OK, applying for 3.16 and stable.

--b.

>
> Signed-off-by: Trond Myklebust <[email protected]>
> ---
> net/sunrpc/svc_xprt.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
> index 06c6ff0cb911..a4acaf2bcf18 100644
> --- a/net/sunrpc/svc_xprt.c
> +++ b/net/sunrpc/svc_xprt.c
> @@ -730,6 +730,8 @@ static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt)
> newxpt = xprt->xpt_ops->xpo_accept(xprt);
> if (newxpt)
> svc_add_new_temp_xprt(serv, newxpt);
> + else
> + module_put(xprt->xpt_class->xcl_owner);
> } else if (xprt->xpt_ops->xpo_has_wspace(xprt)) {
> /* XPT_DATA|XPT_DEFERRED case: */
> dprintk("svc: server %p, pool %u, transport %p, inuse=%d\n",
> --
> 1.9.0
>