ip6: ensure IPv6 failures take precedence over success
authorDan Williams <dcbw@redhat.com>
Thu, 1 Dec 2011 22:11:04 +0000 (16:11 -0600)
committerDan Williams <dcbw@redhat.com>
Thu, 1 Dec 2011 22:11:04 +0000 (16:11 -0600)
The RDNSS and DNSSL failure cases wouldn't clear out the idle
handler of a previous success (if that success hadn't fired yet);
it seems pointless to signal success and then immediately fail.
Second, it would cause a dangling GSource if the device was
removed or NM quit at the right time.

src/ip6-manager/nm-ip6-manager.c

index d6d2497..a427dff 100644 (file)
@@ -112,6 +112,14 @@ typedef struct {
 } NMIP6Device;
 
 static void
+clear_config_changed (NMIP6Device *device)
+{
+       if (device->config_changed_id)
+               g_source_remove (device->config_changed_id);
+       device->config_changed_id = 0;
+}
+
+static void
 nm_ip6_device_destroy (NMIP6Device *device)
 {
        g_return_if_fail (device != NULL);
@@ -124,8 +132,9 @@ nm_ip6_device_destroy (NMIP6Device *device)
 
        if (device->finish_addrconf_id)
                g_source_remove (device->finish_addrconf_id);
-       if (device->config_changed_id)
-               g_source_remove (device->config_changed_id);
+
+       clear_config_changed (device);
+
        g_free (device->iface);
        if (device->rdnss_servers)
                g_array_free (device->rdnss_servers, TRUE);
@@ -267,6 +276,7 @@ rdnss_expired (gpointer user_data)
        nm_log_dbg (LOGD_IP6, "(%s): IPv6 RDNSS information expired", device->iface);
 
        set_rdnss_timeout (device);
+       clear_config_changed (device);
        emit_config_changed (&info);
        return FALSE;
 }
@@ -321,11 +331,12 @@ static gboolean
 dnssl_expired (gpointer user_data)
 {
        NMIP6Device *device = user_data;
-       CallbackInfo info = { device, IP6_DHCP_OPT_NONE };
+       CallbackInfo info = { device, IP6_DHCP_OPT_NONE, FALSE };
 
        nm_log_dbg (LOGD_IP6, "(%s): IPv6 DNSSL information expired", device->iface);
 
        set_dnssl_timeout (device);
+       clear_config_changed (device);
        emit_config_changed (&info);
        return FALSE;
 }