Merge "Fix crash caused by decryption response delay" into tizen
[platform/upstream/connman.git] / src / dhcpv6.c
index b1b2f63..ba54b89 100755 (executable)
@@ -105,20 +105,14 @@ static void clear_timer(struct connman_dhcpv6 *dhcp)
        }
 }
 
-static inline guint get_random(void)
+static guint compute_random(guint val)
 {
-       uint64_t val;
-
-       __connman_util_get_random(&val);
+       uint64_t rand;
 
-       /* Make sure the value is always positive so strip MSB */
-       return ((uint32_t)val) >> 1;
-}
+       __connman_util_get_random(&rand);
 
-static guint compute_random(guint val)
-{
        return val - val / 10 +
-               (get_random() % (2 * 1000)) * val / 10 / 1000;
+               ((guint) rand % (2 * 1000)) * val / 10 / 1000;
 }
 
 /* Calculate a random delay, RFC 3315 chapter 14 */
@@ -202,11 +196,24 @@ static int set_duid(struct connman_service *service,
        unsigned char *duid;
        int duid_len;
 
-       ident = __connman_service_get_ident(service);
+       ident = connman_service_get_identifier(service);
+#if defined TIZEN_EXT
+       if(ident != NULL)
+               DBG("ident : %s", ident);
+#endif
 
        keyfile = connman_storage_load_service(ident);
+
+#if defined TIZEN_EXT
+       if (!keyfile) {
+               keyfile = g_key_file_new();
+               if (!keyfile)
+                       return -EIO;
+       }
+#else
        if (!keyfile)
                return -EINVAL;
+#endif
 
        hex_duid = g_key_file_get_string(keyfile, ident, "IPv6.DHCP.DUID",
                                        NULL);
@@ -240,6 +247,7 @@ static int set_duid(struct connman_service *service,
 
                hex_duid = convert_to_hex(duid, duid_len);
                if (!hex_duid) {
+                       g_free(duid);
                        g_key_file_free(keyfile);
                        return -ENOMEM;
                }
@@ -334,8 +342,8 @@ static void info_req_cb(GDHCPClient *dhcp_client, gpointer user_data)
                                                CONNMAN_IPCONFIG_TYPE_IPV6);
 #else
                                __connman_service_nameserver_remove(service,
-                                               dhcp->nameservers[i],
-                                               false);
+                                                       dhcp->nameservers[i],
+                                                       false);
 #endif
 #if defined TIZEN_EXT
                        }
@@ -468,7 +476,6 @@ static int check_ipv6_addr_prefix(GSList *prefixes, char *address)
                if (!slash)
                        continue;
 
-               prefix = g_strndup(prefix, slash - prefix);
                len = strtol(slash + 1, NULL, 10);
                if (len < 3 || len > 128)
                        break;
@@ -479,6 +486,7 @@ static int check_ipv6_addr_prefix(GSList *prefixes, char *address)
                left = plen % 8;
                i = 16 - count;
 
+               prefix = g_strndup(prefix, slash - prefix);
                inet_pton(AF_INET6, prefix, &addr_prefix);
                inet_pton(AF_INET6, address, &addr);
 
@@ -571,8 +579,8 @@ static int set_other_addresses(GDHCPClient *dhcp_client,
                                        false, CONNMAN_IPCONFIG_TYPE_IPV6);
 #else
                        __connman_service_nameserver_append(service,
-                                               dhcp->nameservers[i],
-                                               false);
+                                                       dhcp->nameservers[i],
+                                                       false);
 #endif
 #if defined TIZEN_EXT
                }
@@ -1000,7 +1008,7 @@ static void do_dad(GDHCPClient *dhcp_client, struct connman_dhcpv6 *dhcp)
 
                ref_own_address(user_data);
 
-               if (inet_pton(AF_INET6, address, &addr) < 0) {
+               if (inet_pton(AF_INET6, address, &addr) != 1) {
                        DBG("Invalid IPv6 address %s %d/%s", address,
                                -errno, strerror(errno));
                        goto fail;