provider: Handle empty nameservers
authorDaniel Wagner <daniel.wagner@bmw-carit.de>
Wed, 26 Jan 2011 08:22:06 +0000 (09:22 +0100)
committerSamuel Ortiz <sameo@linux.intel.com>
Wed, 26 Jan 2011 10:27:16 +0000 (11:27 +0100)
If the VPN server doesn't set any DNS entries provider->nameservers is NULL.
When we change the state of the provider to CONNMAN_PROVIDER_STATE_READY
we shouldn't do any string operations on the NULL pointer namerservers.

(gdb) bt full
No symbol table info available.
        type = CONNMAN_ELEMENT_TYPE_IPV4
        nameservers = 0x0
        value = 0x0
        list = 0x1 = {<error reading variable list (Cannot access memory at address 0x1)>
        err = 0
        element = 0x6a5110
        name = 0x6a5550 "vpn0"
        second_ns = 0x69f1c0 "\004"
        service = 0x6a2630
No locals.

Fixes BMC#12508

Reported by Jeff Zheng <jeff.zheng@intel.com>

src/provider.c

index 53b3ddd..b47b6b9 100644 (file)
@@ -254,6 +254,38 @@ int __connman_provider_remove(const char *path)
        return -ENXIO;
 }
 
+static void provider_set_nameservers(struct connman_provider *provider)
+{
+       char *nameservers = NULL, *name = NULL;
+       const char *value;
+       char *second_ns;
+
+       if (provider->dns == NULL)
+               return;
+
+       name = connman_inet_ifname(provider->element.index);
+
+       nameservers = g_strdup(provider->dns);
+       value = nameservers;
+       second_ns = strchr(value, ' ');
+       if (second_ns)
+               *(second_ns++) = 0;
+       __connman_service_append_nameserver(service, value);
+       value = second_ns;
+
+       while (value) {
+               char *next = strchr(value, ' ');
+               if (next)
+                       *(next++) = 0;
+
+               connman_resolver_append(name, provider->domain, value);
+               value = next;
+       }
+
+       g_free(nameservers);
+       g_free(name);
+}
+
 static int set_connected(struct connman_provider *provider,
                                        connman_bool_t connected)
 {
@@ -265,9 +297,6 @@ static int set_connected(struct connman_provider *provider,
        if (connected == TRUE) {
                enum connman_element_type type = CONNMAN_ELEMENT_TYPE_UNKNOWN;
                struct connman_element *element;
-               char *nameservers = NULL, *name = NULL;
-               const char *value;
-               char *second_ns;
                GSList *list;
                int err;
 
@@ -298,27 +327,7 @@ static int set_connected(struct connman_provider *provider,
 
                __connman_service_set_domainname(service, provider->domain);
 
-               name = connman_inet_ifname(provider->element.index);
-
-               nameservers = g_strdup(provider->dns);
-               value = nameservers;
-               second_ns = strchr(value, ' ');
-               if (second_ns)
-                       *(second_ns++) = 0;
-               __connman_service_append_nameserver(service, value);
-               value = second_ns;
-
-               while (value) {
-                       char *next = strchr(value, ' ');
-                       if (next)
-                               *(next++) = 0;
-
-                       connman_resolver_append(name, provider->domain, value);
-                       value = next;
-               }
-
-               g_free(nameservers);
-               g_free(name);
+               provider_set_nameservers(provider);
 
                for (list = provider->route_list; list; list = list->next) {
                        struct connman_route *route = list->data;