chiark / gitweb /
networkd: netdev - take ref when creating netdevs
authorTom Gundersen <teg@jklm.no>
Tue, 1 Jul 2014 17:41:45 +0000 (19:41 +0200)
committerTom Gundersen <teg@jklm.no>
Tue, 1 Jul 2014 18:33:30 +0000 (20:33 +0200)
We were doing this correctly for when the callback takes the Link object, but
must also do it for the cases it takes the NetDev object.

src/network/networkd-netdev.c
src/network/networkd-veth.c

index a53f0465405ccf12217f17f181d60a3a6105acba..20917e334b3092513048b79eed30d7af58fa0549 100644 (file)
@@ -224,7 +224,7 @@ static int netdev_enter_ready(NetDev *netdev) {
 
 /* callback for netdev's created without a backing Link */
 static int netdev_create_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
 
 /* callback for netdev's created without a backing Link */
 static int netdev_create_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
-        NetDev *netdev = userdata;
+        _cleanup_netdev_unref_ NetDev *netdev = userdata;
         int r;
 
         assert(netdev->state != _NETDEV_STATE_INVALID);
         int r;
 
         assert(netdev->state != _NETDEV_STATE_INVALID);
@@ -388,9 +388,11 @@ static int netdev_create(NetDev *netdev, Link *link, sd_rtnl_message_handler_t c
 
         if (link)
                 r = sd_rtnl_call_async(netdev->manager->rtnl, req, callback, link, 0, NULL);
 
         if (link)
                 r = sd_rtnl_call_async(netdev->manager->rtnl, req, callback, link, 0, NULL);
-        else
+        else {
                 r = sd_rtnl_call_async(netdev->manager->rtnl, req, &netdev_create_handler, netdev, 0, NULL);
                 r = sd_rtnl_call_async(netdev->manager->rtnl, req, &netdev_create_handler, netdev, 0, NULL);
-        if (r < 0) {
+
+                netdev_ref(netdev);
+        } if (r < 0) {
                 log_error_netdev(netdev,
                                  "Could not send rtnetlink message: %s", strerror(-r));
                 return r;
                 log_error_netdev(netdev,
                                  "Could not send rtnetlink message: %s", strerror(-r));
                 return r;
index 3584981cbcf5afd08d2553489fb4a23aea05243b..3eac90ba90ecea36eaf7167b4cfc00f556e4964e 100644 (file)
@@ -145,6 +145,8 @@ int netdev_create_veth(NetDev *netdev, sd_rtnl_message_handler_t callback) {
                 return r;
         }
 
                 return r;
         }
 
+        netdev_ref(netdev);
+
         log_debug_netdev(netdev, "Creating veth netdev: %s",
                          netdev_kind_to_string(netdev->kind));
 
         log_debug_netdev(netdev, "Creating veth netdev: %s",
                          netdev_kind_to_string(netdev->kind));