net/can/j1939/socket.c | 3 +++ 1 file changed, 3 insertions(+)
Commit 25fe97cb7620 ("can: j1939: move j1939_priv_put() into sk_destruct
callback") expects that a call to j1939_priv_put() can be unconditionally
delayed until j1939_sk_sock_destruct() is called. But a refcount leak will
happen when j1939_sk_bind() is called again after j1939_local_ecu_get()
from previous j1939_sk_bind() call returned an error. We need to call
j1939_priv_put() before j1939_sk_bind() returns an error.
Fixes: 25fe97cb7620 ("can: j1939: move j1939_priv_put() into sk_destruct callback")
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
---
The change made by commit 25fe97cb7620 might be relevant to my result
As far as I tested, the only way that can drop the refcount to 1 is to
call j1939_sk_release() (which involves sock_put()) on all j1939 sockets
in https://lkml.kernel.org/r/bb595640-0597-4d18-a9e1-f6eb8e6bb50e@I-love.SAKURA.ne.jp .
net/can/j1939/socket.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c
index 3d8b588822f9..493f49bfaf5d 100644
--- a/net/can/j1939/socket.c
+++ b/net/can/j1939/socket.c
@@ -521,6 +521,9 @@ static int j1939_sk_bind(struct socket *sock, struct sockaddr *uaddr, int len)
ret = j1939_local_ecu_get(priv, jsk->addr.src_name, jsk->addr.sa);
if (ret) {
j1939_netdev_stop(priv);
+ jsk->priv = NULL;
+ synchronize_rcu();
+ j1939_priv_put(priv);
goto out_release_sock;
}
--
2.51.0
On 24.08.2025 19:30:09, Tetsuo Handa wrote: > Commit 25fe97cb7620 ("can: j1939: move j1939_priv_put() into sk_destruct > callback") expects that a call to j1939_priv_put() can be unconditionally > delayed until j1939_sk_sock_destruct() is called. But a refcount leak will > happen when j1939_sk_bind() is called again after j1939_local_ecu_get() > from previous j1939_sk_bind() call returned an error. We need to call > j1939_priv_put() before j1939_sk_bind() returns an error. > > Fixes: 25fe97cb7620 ("can: j1939: move j1939_priv_put() into sk_destruct callback") > Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Applied to linux-can. regards, Marc -- Pengutronix e.K. | Marc Kleine-Budde | Embedded Linux | https://www.pengutronix.de | Vertretung Nürnberg | Phone: +49-5121-206917-129 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |
On Sun, Aug 24, 2025 at 07:30:09PM +0900, Tetsuo Handa wrote: > Commit 25fe97cb7620 ("can: j1939: move j1939_priv_put() into sk_destruct > callback") expects that a call to j1939_priv_put() can be unconditionally > delayed until j1939_sk_sock_destruct() is called. But a refcount leak will > happen when j1939_sk_bind() is called again after j1939_local_ecu_get() > from previous j1939_sk_bind() call returned an error. We need to call > j1939_priv_put() before j1939_sk_bind() returns an error. > > Fixes: 25fe97cb7620 ("can: j1939: move j1939_priv_put() into sk_destruct callback") > Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Tested-by: Oleksij Rempel <o.rempel@pengutronix.de> Acked-by: Oleksij Rempel <o.rempel@pengutronix.de> -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Hi Tetsuo, On Sun, Aug 24, 2025 at 07:30:09PM +0900, Tetsuo Handa wrote: > Commit 25fe97cb7620 ("can: j1939: move j1939_priv_put() into sk_destruct > callback") expects that a call to j1939_priv_put() can be unconditionally > delayed until j1939_sk_sock_destruct() is called. But a refcount leak will > happen when j1939_sk_bind() is called again after j1939_local_ecu_get() > from previous j1939_sk_bind() call returned an error. We need to call > j1939_priv_put() before j1939_sk_bind() returns an error. > > Fixes: 25fe97cb7620 ("can: j1939: move j1939_priv_put() into sk_destruct callback") > Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> > --- > The change made by commit 25fe97cb7620 might be relevant to my result > > As far as I tested, the only way that can drop the refcount to 1 is to > call j1939_sk_release() (which involves sock_put()) on all j1939 sockets > > in https://lkml.kernel.org/r/bb595640-0597-4d18-a9e1-f6eb8e6bb50e@I-love.SAKURA.ne.jp . Thank you for your work! Right now I'm on open source summit and can't quickly respond/test your patches. I'll try to do my best ASAP next week. Best Regards, Oleksij -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
© 2016 - 2025 Red Hat, Inc.