From ce3473dc90ccd8536f3030d67d35a6a7729e2473 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Fri, 6 Feb 2009 15:38:09 -0500 Subject: [PATCH] clear pending activation checks on device removal Found by Drew Moseley --- src/NetworkManagerPolicy.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/NetworkManagerPolicy.c b/src/NetworkManagerPolicy.c index 2de01f897d..6bba92f2b1 100644 --- a/src/NetworkManagerPolicy.c +++ b/src/NetworkManagerPolicy.c @@ -860,19 +860,33 @@ static void device_removed (NMManager *manager, NMDevice *device, gpointer user_data) { NMPolicy *policy = (NMPolicy *) user_data; - GSList *iter = policy->dev_signal_ids; + GSList *iter; + + /* Clear any idle callbacks for this device */ + iter = policy->pending_activation_checks; + while (iter) { + ActivateData *data = (ActivateData *) iter->data; + GSList *next = g_slist_next (iter); + + if (data->device == device) { + g_source_remove (data->id); + g_object_unref (data->device); + g_free (data); + policy->pending_activation_checks = g_slist_delete_link (policy->pending_activation_checks, iter); + } + iter = next; + } /* Clear any signal handlers for this device */ + iter = policy->dev_signal_ids; while (iter) { DeviceSignalID *data = (DeviceSignalID *) iter->data; GSList *next = g_slist_next (iter); if (data->device == device) { - policy->dev_signal_ids = g_slist_remove_link (policy->dev_signal_ids, iter); - g_signal_handler_disconnect (data->device, data->id); g_free (data); - g_slist_free (iter); + policy->dev_signal_ids = g_slist_delete_link (policy->dev_signal_ids, iter); } iter = next; }