]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: link_drop() and netdev_drop() remove reference from manager
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 4 Nov 2018 11:36:13 +0000 (20:36 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 5 Nov 2018 04:19:02 +0000 (13:19 +0900)
src/network/netdev/netdev.c
src/network/networkd-link.c
src/network/networkd-manager.c

index 6eb63355a480d53fae9ad8790c243f04e78f18d7..06709679a03af7065185d01eea938d08e0e4f5fb 100644 (file)
@@ -112,13 +112,19 @@ static void netdev_callbacks_clear(NetDev *netdev) {
         }
 }
 
+static void netdev_detach_from_manager(NetDev *netdev) {
+        if (netdev->ifname && netdev->manager)
+                hashmap_remove(netdev->manager->netdevs, netdev->ifname);
+
+        netdev->manager = NULL;
+}
+
 static NetDev *netdev_free(NetDev *netdev) {
         assert(netdev);
 
         netdev_callbacks_clear(netdev);
 
-        if (netdev->ifname && netdev->manager)
-                hashmap_remove(netdev->manager->netdevs, netdev->ifname);
+        netdev_detach_from_manager(netdev);
 
         free(netdev->filename);
 
@@ -167,6 +173,8 @@ void netdev_drop(NetDev *netdev) {
 
         netdev_callbacks_clear(netdev);
 
+        netdev_detach_from_manager(netdev);
+
         netdev_unref(netdev);
 
         return;
index c4923980e396b068d113a18ecc61c687de1ec0bb..a52ddee118e6d5725a910d5ac28611811851c1a6 100644 (file)
@@ -503,6 +503,17 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
         return 0;
 }
 
+static void link_detach_from_manager(Link *link) {
+        if (!link || !link->manager)
+                return;
+
+        hashmap_remove(link->manager->links, INT_TO_PTR(link->ifindex));
+        set_remove(link->manager->links_requesting_uuid, link);
+        link_clean(link);
+
+        link->manager = NULL;
+}
+
 static Link *link_free(Link *link) {
         Address *address;
         Link *carrier;
@@ -552,11 +563,7 @@ static Link *link_free(Link *link) {
         sd_ndisc_unref(link->ndisc);
         sd_radv_unref(link->radv);
 
-        if (link->manager) {
-                hashmap_remove(link->manager->links, INT_TO_PTR(link->ifindex));
-                set_remove(link->manager->links_requesting_uuid, link);
-                link_clean(link);
-        }
+        link_detach_from_manager(link);
 
         free(link->ifname);
 
@@ -2265,6 +2272,9 @@ void link_drop(Link *link) {
         log_link_debug(link, "Link removed");
 
         (void) unlink(link->state_file);
+
+        link_detach_from_manager(link);
+
         link_unref(link);
 
         return;
index 9dcd911535877a932932230073fb191a5d63105a..89fbb4168b40d9edda14d3e328b29f71c1710776 100644 (file)
@@ -1407,10 +1407,9 @@ int manager_new(Manager **ret) {
 }
 
 void manager_free(Manager *m) {
+        AddressPool *pool;
         Network *network;
-        NetDev *netdev;
         Link *link;
-        AddressPool *pool;
 
         if (!m)
                 return;
@@ -1437,16 +1436,14 @@ void manager_free(Manager *m) {
                 link_unref(link);
         }
 
-        set_free_with_destructor(m->dirty_links, link_unref);
-        hashmap_free(m->links);
-        set_free(m->links_requesting_uuid);
+        m->dirty_links = set_free_with_destructor(m->dirty_links, link_unref);
+        m->links = hashmap_free(m->links);
+        m->links_requesting_uuid = set_free(m->links_requesting_uuid);
         set_free(m->duids_requesting_uuid);
 
         hashmap_free(m->networks_by_name);
 
-        while ((netdev = hashmap_first(m->netdevs)))
-                netdev_unref(netdev);
-        hashmap_free(m->netdevs);
+        m->netdevs = hashmap_free_with_destructor(m->netdevs, netdev_unref);
 
         while ((pool = m->address_pools))
                 address_pool_free(pool);