Skip to content

Commit 9926cb5

Browse files
lxindavem330
authored andcommitted
tipc: change to check tipc_own_id to return in tipc_net_stop
When running a syz script, a panic occurred: [ 156.088228] BUG: KASAN: use-after-free in tipc_disc_timeout+0x9c9/0xb20 [tipc] [ 156.094315] Call Trace: [ 156.094844] <IRQ> [ 156.095306] dump_stack+0x7c/0xc0 [ 156.097346] print_address_description+0x65/0x22e [ 156.100445] kasan_report.cold.3+0x37/0x7a [ 156.102402] tipc_disc_timeout+0x9c9/0xb20 [tipc] [ 156.106517] call_timer_fn+0x19a/0x610 [ 156.112749] run_timer_softirq+0xb51/0x1090 It was caused by the netns freed without deleting the discoverer timer, while later on the netns would be accessed in the timer handler. The timer should have been deleted by tipc_net_stop() when cleaning up a netns. However, tipc has been able to enable a bearer and start d->timer without the local node_addr set since Commit 52dfae5 ("tipc: obtain node identity from interface by default"), which caused the timer not to be deleted in tipc_net_stop() then. So fix it in tipc_net_stop() by changing to check local node_id instead of local node_addr, as Jon suggested. While at it, remove the calling of tipc_nametbl_withdraw() there, since tipc_nametbl_stop() will take of the nametbl's freeing after. Fixes: 52dfae5 ("tipc: obtain node identity from interface by default") Reported-by: syzbot+a25307ad099309f1c2b9@syzkaller.appspotmail.com Signed-off-by: Xin Long <lucien.xin@gmail.com> Acked-by: Ying Xue <ying.xue@windriver.com> Acked-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent b7ebee2 commit 9926cb5

File tree

1 file changed

+1
-4
lines changed

1 file changed

+1
-4
lines changed

net/tipc/net.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,9 @@ void tipc_sched_net_finalize(struct net *net, u32 addr)
163163

164164
void tipc_net_stop(struct net *net)
165165
{
166-
u32 self = tipc_own_addr(net);
167-
168-
if (!self)
166+
if (!tipc_own_id(net))
169167
return;
170168

171-
tipc_nametbl_withdraw(net, TIPC_CFG_SRV, self, self, self);
172169
rtnl_lock();
173170
tipc_bearer_stop(net);
174171
tipc_node_stop(net);

0 commit comments

Comments
 (0)