linux/net/tipc
Yuqi Xu 3acdd44385 tipc: destroy topsrv workqueues before closing connections
tipc_topsrv_stop() closed subscriber connections while the topology
server's send and receive workqueues were still running. Socket
callbacks and subscription events could then queue more work, and
in-flight send/recv work could drop the last connection reference
during the conn_idr walk.

That race produced several teardown failures: refcount_t addition on
0 from conn_get() on a connection whose release was blocked on
idr_lock, a subsequent use-after-free in tipc_conn_close(),
queue_work() on an already destroyed workqueue from the listener
data-ready callback, and an RCU stall in tipc_topsrv_exit_net()
while the walk spun under idr_lock.

Clear srv->listener under idr_lock so it acts as a shutdown flag,
skip queue_work() once it is NULL, destroy the workqueues to flush
in-flight work, and only then close the remaining connections.
Refuse tipc_conn_lookup() after that flag is cleared, and drop
idr_lock when the teardown walk finds no connection, so an
in-flight subscription event cannot pin idr_in_use while the
walk holds the lock.

v3 supersedes the narrower in-thread diff Tung Quang Nguyen
posted on 2026-09-23. It keeps his teardown order and adds the
lookup refusal and the empty-idr unlock.

Fixes: c5fa7b3cf3 ("tipc: introduce new TIPC server infrastructure")
Cc: stable@vger.kernel.org
Reported-by: Vega <vega@nebusec.ai>
Assisted-by: LLM
Signed-off-by: Yuqi Xu <xuyuqiabc@gmail.com>
Reviewed-by: Ren Wei <weir@nebusec.ai>
Signed-off-by: David S. Miller <davem@davemloft.net>
2026-10-02 08:20:15 +01:00
..
addr.c tipc: adjust tipc_nodeid2string() to return string length 2025-09-30 11:22:39 +02:00
addr.h tipc: adjust tipc_nodeid2string() to return string length 2025-09-30 11:22:39 +02:00
bcast.c tipc: fix out-of-bounds read in broadcast Gap ACK blocks 2026-06-29 17:30:20 -07:00
bcast.h tipc: fix out-of-bounds read in broadcast Gap ACK blocks 2026-06-29 17:30:20 -07:00
bearer.c tipc: fix UAF in tipc_l2_send_msg() 2026-06-15 12:50:29 -07:00
bearer.h
core.c tipc: avoid busy looping in tipc_exit_net() 2026-06-25 08:53:00 -07:00
core.h kernel.h: drop hex.h and update all hex.h users 2026-01-20 19:44:19 -08:00
crypto.c tipc: prevent GCM nonce reuse on peer key changes 2026-09-28 18:21:34 -07:00
crypto.h
diag.c
discover.c tipc: fix use-after-free of the discoverer in tipc_disc_rcv() 2026-06-21 14:28:22 -07:00
discover.h
eth_media.c
group.c tipc: reject invalid and unexpected GRP_ACK_MSG to prevent bc_ackers underflow 2026-09-18 15:42:47 -07:00
group.h
ib_media.c
Kconfig ipv6: convert CONFIG_IPV6 to built-in only and clean up Kconfigs 2026-03-29 11:21:22 -07:00
link.c tipc: Dont send random pad bytes in RESET/ACTIVATE messages 2026-08-31 20:02:36 -07:00
link.h
Makefile
monitor.c tipc: Fix a data race on mon->peer_cnt in mon_timeout() 2026-09-24 10:21:45 -07:00
monitor.h
msg.c tipc: fix double-free in tipc_buf_append() 2026-04-23 11:45:01 -07:00
msg.h
name_distr.c tipc: reject inverted service ranges from peer bindings 2026-06-11 16:01:16 -07:00
name_distr.h
name_table.c tipc: fix NULL deref in tipc_named_node_up() on empty publication list 2026-08-31 20:01:49 -07:00
name_table.h net: tipc: remove one synchronize_net() from tipc_nametbl_stop() 2024-12-06 17:41:28 -08:00
net.c tipc: Fix use-after-free in tipc_mon_reinit_self(). 2025-11-10 18:14:40 -08:00
net.h
netlink_compat.c tipc: fix infinite loop in __tipc_nl_compat_dumpit 2026-07-21 15:12:23 -07:00
netlink.c tipc: fix u16 MTU truncation in media and bearer MTU validation 2026-07-23 11:41:03 +02:00
netlink.h
node.c tipc: hold a reference to nodes found by link name 2026-10-01 17:15:38 -07:00
node.h
socket.c tipc: avoid use-after-free in poll trace queue dumps 2026-07-27 15:18:59 -07:00
socket.h
subscr.c treewide: Replace kmalloc with kmalloc_obj for non-scalar types 2026-02-21 01:02:28 -08:00
subscr.h
sysctl.c net: Remove ctl_table sentinel elements from several networking subsystems 2024-05-03 13:29:42 +01:00
topsrv.c tipc: destroy topsrv workqueues before closing connections 2026-10-02 08:20:15 +01:00
topsrv.h
trace.c
trace.h tracing/treewide: Remove second parameter of __assign_str() 2024-05-22 20:14:47 -04:00
udp_media.c tipc: serialize udp bearer replicast list updates 2026-07-21 11:57:21 -07:00
udp_media.h