From 826653fe7c21aa7a23af2385133651712d99f3e5 Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Mon, 26 Nov 2012 14:47:23 +0200 Subject: 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. --- vpn/vpn-provider.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'vpn/vpn-provider.c') 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) -- cgit v1.2.3