On Fri, Aug 05, 2022 at 11:56:18AM +0300, Fedor Pchelkin wrote: > Hi Oleksij, > > On 29.07.2022 07:22, Oleksij Rempel wrote: > > Initial issue can be reproduced by using real (slow) CAN with j1939cat[1] > > tool. Both parts should be started to make sure the j1939_session_tx_dat() will > > actually start using the queue. After pushing about 100K of data, application > > will try to close the socket and exit. After socket is closed, all skb related > > to this socket will be freed and j1939_session_tx_dat() will use freed skbs. > > Ok, the patch I suggested was a kind of a guess, now I understand that > it breaks important logic. > > On 29.07.2022 07:22, Oleksij Rempel wrote: > > This skb_get() is counter part of skb_unref() > > j1939_session_skb_drop_old(). > > However, we have a case [1] where j1939_session_skb_queue() is called > but the corresponding j1939_session_skb_drop_old() is not called and it > causes a memory leak. > > I tried to investigate it a little bit: the thing is that > j1939_session_skb_drop_old() can be called only when processing > J1939_ETP_CMD_CTS. On the contrary, as I can see, > j1939_session_skb_queue() can be called independently from > J1939_ETP_CMD_CTS so the two functions obviously do not correspond to > each other. > > In reproducer case there is a J1939_ETP_CMD_RTS processing, then > we send some messages (where j1939_session_skb_queue() is called) and > after that J1939_ETP_CMD_ABORT is processed and we lose those skbs. Ah.. good point. In this case it will go to: j1939_session_destroy() skb_queue_purge(&session->skb_queue) kfree_skb(skb); And in the normal path we have: j1939_session_skb_drop_old() skb_unref(do_skb); kfree_skb(do_skb); It means skb_queue_purge() should be replaced with something like: while ((skb = skb_dequeue(list)) != NULL) { /* drop ref taken in j1939_session_skb_queue() */ skb_unref(skb); kfree_skb(skb); } Can you please test it? 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 |