Syzkaller reported memory leak of skbs introduced with the commit 2030043e616c ("can: j1939: fix Use-after-Free, hold skb ref while in use"). Link to Syzkaller info and repro: https://forge.ispras.ru/issues/11743 The suggested solution was tested on the new memory-leak Syzkaller repro and on the old use-after-free repro (that use-after-free bug was solved with aforementioned commit). Although there can probably be another situations when the numbers of skb_get() and skb_unref() calls don't match and I don't see it in right way. Moreover, skb_unref() call can be harmlessly removed from line 338 in j1939_session_skb_drop_old() (/net/can/j1939/transport.c). But then I assume this removal ruins the whole reference counts logic... Overall, there is definitely something not clear in skb reference counts management with skb_get() and skb_unref(). The solution we suggested fixes the leaks and use-after-free's induced by Syzkaller but perhaps the origin of the problem can be somewhere else. Found by Linux Verification Center (linuxtesting.org) with Syzkaller. Signed-off-by: Fedor Pchelkin <pchelkin@xxxxxxxxx> Signed-off-by: Alexey Khoroshilov <khoroshilov@xxxxxxxxx> --- net/can/j1939/transport.c | 1 - 1 file changed, 1 deletion(-) diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c index 307ee1174a6e..9600b339cbf8 100644 --- a/net/can/j1939/transport.c +++ b/net/can/j1939/transport.c @@ -356,7 +356,6 @@ void j1939_session_skb_queue(struct j1939_session *session, skcb->flags |= J1939_ECU_LOCAL_SRC; - skb_get(skb); skb_queue_tail(&session->skb_queue, skb); } -- 2.25.1