summaryrefslogtreecommitdiff
path: root/vpn/vpn-provider.c
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@linux.intel.com>2012-11-26 14:47:23 +0200
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-11-26 16:25:28 +0200
commit826653fe7c21aa7a23af2385133651712d99f3e5 (patch)
tree0e9fa410a8c7de465a123eb1ee6a0cad910bbb12 /vpn/vpn-provider.c
parentfef3e291f3acc17435f08b0d966272f53f583f21 (diff)
downloadconnman-826653fe7c21aa7a23af2385133651712d99f3e5.tar.gz
connman-826653fe7c21aa7a23af2385133651712d99f3e5.tar.bz2
connman-826653fe7c21aa7a23af2385133651712d99f3e5.zip
vpn-provider: VPN driver pointer was not cleared
When VPN driver is unregistered, we must clear the corresponding pointer in provider struct. If this is not done we will have already freed memory access in clean_provider() function.
Diffstat (limited to 'vpn/vpn-provider.c')
-rw-r--r--vpn/vpn-provider.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/vpn/vpn-provider.c b/vpn/vpn-provider.c
index a69b458e..f5291229 100644
--- a/vpn/vpn-provider.c
+++ b/vpn/vpn-provider.c
@@ -2104,9 +2104,24 @@ int vpn_provider_driver_register(struct vpn_provider_driver *driver)
void vpn_provider_driver_unregister(struct vpn_provider_driver *driver)
{
+ GHashTableIter iter;
+ gpointer value, key;
+
DBG("driver %p name %s", driver, driver->name);
driver_list = g_slist_remove(driver_list, driver);
+
+ g_hash_table_iter_init(&iter, provider_hash);
+ while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+ struct vpn_provider *provider = value;
+
+ if (provider != NULL && provider->driver != NULL &&
+ provider->driver->type == driver->type &&
+ g_strcmp0(provider->driver->name,
+ driver->name) == 0) {
+ provider->driver = NULL;
+ }
+ }
}
static gboolean check_vpn_count(gpointer data)