When a client roamed back to a node before it got time to destroy the
pending local entry (i.e. within the same originator interval) the old
global one is directly removed from hash table and left as such.
But because this entry had an extra reference taken at lookup (i.e using
batadv_tt_global_hash_find) there is no way its memory will be reclaimed
at any time causing the following memory leak:
unreferenced object 0xffff0000073c8000 (size 18560):
comm "softirq", pid 0, jiffies
4294907738 (age 228.644s)
hex dump (first 32 bytes):
06 31 ac 12 c7 7a 05 00 01 00 00 00 00 00 00 00 .1...z..........
2c ad be 08 00 80 ff ff 6c b6 be 08 00 80 ff ff ,.......l.......
backtrace:
[<
00000000ee6e0ffa>] kmem_cache_alloc+0x1b4/0x300
[<
000000000ff2fdbc>] batadv_tt_global_add+0x700/0xe20
[<
00000000443897c7>] _batadv_tt_update_changes+0x21c/0x790
[<
000000005dd90463>] batadv_tt_update_changes+0x3c/0x110
[<
00000000a2d7fc57>] batadv_tt_tvlv_unicast_handler_v1+0xafc/0xe10
[<
0000000011793f2a>] batadv_tvlv_containers_process+0x168/0x2b0
[<
00000000b7cbe2ef>] batadv_recv_unicast_tvlv+0xec/0x1f4
[<
0000000042aef1d8>] batadv_batman_skb_recv+0x25c/0x3a0
[<
00000000bbd8b0a2>] __netif_receive_skb_core.isra.0+0x7a8/0xe90
[<
000000004033d428>] __netif_receive_skb_one_core+0x64/0x74
[<
000000000f39a009>] __netif_receive_skb+0x48/0xe0
[<
00000000f2cd8888>] process_backlog+0x174/0x344
[<
00000000507d6564>] __napi_poll+0x58/0x1f4
[<
00000000b64ef9eb>] net_rx_action+0x504/0x590
[<
00000000056fa5e4>] _stext+0x1b8/0x418
[<
00000000878879d6>] run_ksoftirqd+0x74/0xa4
unreferenced object 0xffff00000bae1a80 (size 56):
comm "softirq", pid 0, jiffies
4294910888 (age 216.092s)
hex dump (first 32 bytes):
00 78 b1 0b 00 00 ff ff 0d 50 00 00 00 00 00 00 .x.......P......
00 00 00 00 00 00 00 00 50 c8 3c 07 00 00 ff ff ........P.<.....
backtrace:
[<
00000000ee6e0ffa>] kmem_cache_alloc+0x1b4/0x300
[<
00000000d9aaa49e>] batadv_tt_global_add+0x53c/0xe20
[<
00000000443897c7>] _batadv_tt_update_changes+0x21c/0x790
[<
000000005dd90463>] batadv_tt_update_changes+0x3c/0x110
[<
00000000a2d7fc57>] batadv_tt_tvlv_unicast_handler_v1+0xafc/0xe10
[<
0000000011793f2a>] batadv_tvlv_containers_process+0x168/0x2b0
[<
00000000b7cbe2ef>] batadv_recv_unicast_tvlv+0xec/0x1f4
[<
0000000042aef1d8>] batadv_batman_skb_recv+0x25c/0x3a0
[<
00000000bbd8b0a2>] __netif_receive_skb_core.isra.0+0x7a8/0xe90
[<
000000004033d428>] __netif_receive_skb_one_core+0x64/0x74
[<
000000000f39a009>] __netif_receive_skb+0x48/0xe0
[<
00000000f2cd8888>] process_backlog+0x174/0x344
[<
00000000507d6564>] __napi_poll+0x58/0x1f4
[<
00000000b64ef9eb>] net_rx_action+0x504/0x590
[<
00000000056fa5e4>] _stext+0x1b8/0x418
[<
00000000878879d6>] run_ksoftirqd+0x74/0xa4
Releasing the extra reference from batadv_tt_global_hash_find even at
roam back when batadv_tt_global_free is called fixes this memory leak.
Cc: stable@vger.kernel.org
Fixes:
068ee6e204e1 ("batman-adv: roaming handling mechanism redesign")
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
Signed-off-by; Sven Eckelmann <sven@narfation.org>
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>