From 4eaaf192176994b4fb70a2a80d2cc67e8cf22525 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Mon, 13 Jul 2026 16:36:39 +0200 Subject: [PATCH] kernel-netlink: Properly clean up pending entry if VIP installation failed This could prevent the VIP from getting installed later and actually causes those threads to block indefinitely as they wait for the entry to either get removed or the VIP marked as installed, which will never happen. Fixes: c6b401581a75 ("Changed how kernel-netlink handles virtual IP addresses") --- .../plugins/kernel_netlink/kernel_netlink_net.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c b/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c index 6742b618d..6f9973dc5 100644 --- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c +++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c @@ -2450,6 +2450,17 @@ METHOD(kernel_net_t, add_ip, status_t, } this->lock->unlock(this->lock); } + this->lock->write_lock(this->lock); + entry = this->vips->get_match(this->vips, &lookup, + (void*)addr_map_entry_match); + if (entry) + { /* clean up the pending entry we inserted */ + iface->addrs->remove(iface->addrs, addr, NULL); + addr_map_entry_remove(this->vips, addr, iface); + addr_entry_destroy(addr); + this->condvar->broadcast(this->condvar); + } + this->lock->unlock(this->lock); DBG1(DBG_KNL, "adding virtual IP %H failed", virtual_ip); return FAILED; }