dhcpv6: Remove timer properly in error cases
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Fri, 4 May 2012 10:32:09 +0000 (13:32 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Fri, 4 May 2012 13:15:59 +0000 (16:15 +0300)
Needed so that we do not access stale pointers from
timer handler.

src/dhcpv6.c

index 5d09799..bf764c8 100644 (file)
@@ -343,20 +343,24 @@ static int dhcpv6_info_request(struct connman_dhcpv6 *dhcp)
        index = connman_network_get_index(dhcp->network);
 
        dhcp_client = g_dhcp_client_new(G_DHCP_IPV6, index, &error);
-       if (error != G_DHCP_CLIENT_ERROR_NONE)
+       if (error != G_DHCP_CLIENT_ERROR_NONE) {
+               clear_timer(dhcp);
                return -EINVAL;
+       }
 
        if (getenv("CONNMAN_DHCPV6_DEBUG"))
                g_dhcp_client_set_debug(dhcp_client, dhcpv6_debug, "DHCPv6");
 
        service = __connman_service_lookup_from_network(dhcp->network);
        if (service == NULL) {
+               clear_timer(dhcp);
                g_dhcp_client_unref(dhcp_client);
                return -EINVAL;
        }
 
        ret = set_duid(service, dhcp->network, dhcp_client, index);
        if (ret < 0) {
+               clear_timer(dhcp);
                g_dhcp_client_unref(dhcp_client);
                return ret;
        }
@@ -1092,20 +1096,24 @@ static int dhcpv6_solicitation(struct connman_dhcpv6 *dhcp)
        index = connman_network_get_index(dhcp->network);
 
        dhcp_client = g_dhcp_client_new(G_DHCP_IPV6, index, &error);
-       if (error != G_DHCP_CLIENT_ERROR_NONE)
+       if (error != G_DHCP_CLIENT_ERROR_NONE) {
+               clear_timer(dhcp);
                return -EINVAL;
+       }
 
        if (getenv("CONNMAN_DHCPV6_DEBUG"))
                g_dhcp_client_set_debug(dhcp_client, dhcpv6_debug, "DHCPv6");
 
        service = __connman_service_lookup_from_network(dhcp->network);
        if (service == NULL) {
+               clear_timer(dhcp);
                g_dhcp_client_unref(dhcp_client);
                return -EINVAL;
        }
 
        ret = set_duid(service, dhcp->network, dhcp_client, index);
        if (ret < 0) {
+               clear_timer(dhcp);
                g_dhcp_client_unref(dhcp_client);
                return ret;
        }