summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Wagner <daniel.wagner@bmw-carit.de>2011-01-26 09:22:06 +0100
committerSamuel Ortiz <sameo@linux.intel.com>2011-01-26 11:27:16 +0100
commit034e022c01d625f0cd9fac7aaa96eee980f1cb3e (patch)
treec075e0d4e8296e4490a64ae398e19cab53e785c2 /src
parenteae376791c4c19ceb0c09b26f722d685eed6d03f (diff)
downloadconnman-034e022c01d625f0cd9fac7aaa96eee980f1cb3e.tar.gz
connman-034e022c01d625f0cd9fac7aaa96eee980f1cb3e.tar.bz2
connman-034e022c01d625f0cd9fac7aaa96eee980f1cb3e.zip
provider: Handle empty nameservers
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>
Diffstat (limited to 'src')
-rw-r--r--src/provider.c57
1 files changed, 33 insertions, 24 deletions
diff --git a/src/provider.c b/src/provider.c
index 53b3ddd3..b47b6b9d 100644
--- a/src/provider.c
+++ b/src/provider.c
@@ -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;