diff options
author | Jukka Rissanen <jukka.rissanen@linux.intel.com> | 2012-11-26 14:47:23 +0200 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2012-11-26 16:25:28 +0200 |
commit | 826653fe7c21aa7a23af2385133651712d99f3e5 (patch) | |
tree | 0e9fa410a8c7de465a123eb1ee6a0cad910bbb12 /vpn/vpn-provider.c | |
parent | fef3e291f3acc17435f08b0d966272f53f583f21 (diff) | |
download | connman-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.c | 15 |
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) |