]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: manager do not unef netlink and gennetlink early
authorSusant Sahani <ssahani@redhat.com>
Thu, 2 May 2019 09:52:03 +0000 (15:22 +0530)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 7 May 2019 14:55:19 +0000 (16:55 +0200)
Because of this the fd is getting closed and we getting errors
like
```
^Ceno1: Could not send rtnetlink message: Bad file descriptor
enp7s0f0: Could not send rtnetlink message: Bad file descriptor
enp7s0f0: Cannot delete unreachable route for DHCPv6 delegated subnet 2a0a:...:fc::/62: Bad file descriptor
Assertion '*_head == _item' failed at ../systemd/src/network/networkd-route.c:126, function route_free(). Aborting.
Aborted
```

Closes one of https://github.com/systemd/systemd/issues/12452

src/network/networkd-manager.c

index 7d55142c41bdd2c0f28729804072cf29c8edbd83..047296cbf0ee09bcd9ff1c49c4ae6a276f2135e2 100644 (file)
@@ -1427,7 +1427,6 @@ int manager_new(Manager **ret) {
 
 void manager_free(Manager *m) {
         AddressPool *pool;
-        Network *network;
         Link *link;
 
         if (!m)
@@ -1435,10 +1434,6 @@ void manager_free(Manager *m) {
 
         free(m->state_file);
 
-        sd_netlink_unref(m->rtnl);
-        sd_netlink_unref(m->genl);
-        sd_resolve_unref(m->resolve);
-
         while ((link = hashmap_first(m->dhcp6_prefixes)))
                 manager_dhcp6_prefix_remove_all(m, link);
         hashmap_free(m->dhcp6_prefixes);
@@ -1457,9 +1452,7 @@ void manager_free(Manager *m) {
         m->links = hashmap_free_with_destructor(m->links, link_unref);
 
         m->duids_requesting_uuid = set_free(m->duids_requesting_uuid);
-        while ((network = m->networks))
-                network_unref(network);
-        hashmap_free(m->networks_by_name);
+        m->networks_by_name = hashmap_free_with_destructor(m->networks_by_name, network_unref);
 
         m->netdevs = hashmap_free_with_destructor(m->netdevs, netdev_unref);
 
@@ -1472,6 +1465,10 @@ void manager_free(Manager *m) {
         m->rules_foreign = set_free_with_destructor(m->rules_foreign, routing_policy_rule_free);
         set_free_with_destructor(m->rules_saved, routing_policy_rule_free);
 
+        sd_netlink_unref(m->rtnl);
+        sd_netlink_unref(m->genl);
+        sd_resolve_unref(m->resolve);
+
         sd_event_unref(m->event);
 
         sd_device_monitor_unref(m->device_monitor);