can: j1939: make sure socket is held as long as session exists
authorOleksij Rempel <o.rempel@pengutronix.de>
Thu, 7 Nov 2019 17:51:40 +0000 (18:51 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 13 Nov 2019 09:42:34 +0000 (10:42 +0100)
We link the socket to the session to be able provide socket specific
notifications. For example messages over error queue.

We need to keep the socket held, while we have a reference to it.

Fixes: 9d71dd0c7009 ("can: add support of SAE J1939 protocol")
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
net/can/j1939/transport.c

index ecdedfc0b10c2fa0816843f5bd40f5189e5c13e9..afc2adfd97e475dd64a0e126ccaef3291fae09a6 100644 (file)
@@ -255,6 +255,7 @@ static void __j1939_session_drop(struct j1939_session *session)
                return;
 
        j1939_sock_pending_del(session->sk);
+       sock_put(session->sk);
 }
 
 static void j1939_session_destroy(struct j1939_session *session)
@@ -1875,6 +1876,7 @@ struct j1939_session *j1939_tp_send(struct j1939_priv *priv,
                return ERR_PTR(-ENOMEM);
 
        /* skb is recounted in j1939_session_new() */
+       sock_hold(skb->sk);
        session->sk = skb->sk;
        session->transmission = true;
        session->pkt.total = (size + 6) / 7;