network: use hashmap_remove_value() on updating mapping for Link objects

E.g. on issue #20203, we may wrongly remove entry for another interface.
Let's mitigate issue on such situation for safety, though this does not
solve the issue.
This commit is contained in:
Yu Watanabe
2026-06-13 18:55:31 +09:00
parent 70d83c3d35
commit c96f69e63c
+5 -5
View File
@@ -1150,14 +1150,14 @@ static Link *link_drop(Link *link) {
link_clean(link);
STRV_FOREACH(n, link->alternative_names)
hashmap_remove(link->manager->links_by_name, *n);
hashmap_remove(link->manager->links_by_name, link->ifname);
hashmap_remove_value(link->manager->links_by_name, *n, link);
hashmap_remove_value(link->manager->links_by_name, link->ifname, link);
/* bonding master and its slaves have the same hardware address. */
hashmap_remove_value(link->manager->links_by_hw_addr, &link->hw_addr, link);
/* The following must be called at last. */
assert_se(hashmap_remove(link->manager->links_by_index, INT_TO_PTR(link->ifindex)) == link);
hashmap_remove_value(link->manager->links_by_index, INT_TO_PTR(link->ifindex), link);
if (notify)
manager_notify_hook_filters(link->manager);
@@ -2594,7 +2594,7 @@ static int link_update_alternative_names(Link *link, sd_netlink_message *message
return 0;
STRV_FOREACH(n, link->alternative_names)
hashmap_remove(link->manager->links_by_name, *n);
hashmap_remove_value(link->manager->links_by_name, *n, link);
strv_free_and_replace(link->alternative_names, altnames);
@@ -2626,7 +2626,7 @@ static int link_update_name(Link *link, sd_netlink_message *message) {
log_link_info(link, "Interface name change detected, renamed to %s.", ifname);
hashmap_remove(link->manager->links_by_name, link->ifname);
hashmap_remove_value(link->manager->links_by_name, link->ifname, link);
r = free_and_strdup(&link->ifname, ifname);
if (r < 0)