From: Jukka Rissanen Date: Fri, 4 May 2012 10:32:09 +0000 (+0300) Subject: dhcpv6: Remove timer properly in error cases X-Git-Tag: 0.85~11 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4cd19238f5499623391ebf74c74af03905a14ef8;p=platform%2Fupstream%2Fconnman.git dhcpv6: Remove timer properly in error cases Needed so that we do not access stale pointers from timer handler. --- diff --git a/src/dhcpv6.c b/src/dhcpv6.c index 5d09799..bf764c8 100644 --- a/src/dhcpv6.c +++ b/src/dhcpv6.c @@ -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; }