diff options
author | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2011-01-26 09:22:06 +0100 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2011-01-26 11:27:16 +0100 |
commit | 034e022c01d625f0cd9fac7aaa96eee980f1cb3e (patch) | |
tree | c075e0d4e8296e4490a64ae398e19cab53e785c2 /src | |
parent | eae376791c4c19ceb0c09b26f722d685eed6d03f (diff) | |
download | connman-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.c | 57 |
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; |