vpn-provider: VPN driver pointer was not cleared
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Mon, 26 Nov 2012 12:47:23 +0000 (14:47 +0200)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Mon, 26 Nov 2012 14:25:28 +0000 (16:25 +0200)
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.

vpn/vpn-provider.c

index a69b458..f529122 100644 (file)
@@ -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)