From a240e6549bc2f39b68a5e1fd0c20546ba9106ced Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Tue, 31 Mar 2009 13:10:00 -0400 Subject: [PATCH] core: ensure device is removed from the device list before signaling its removal Might fix lp#319918 --- src/nm-manager.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/nm-manager.c b/src/nm-manager.c index b6a8a275fb..8382944daa 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -1496,8 +1496,7 @@ static void sync_devices (NMManager *self) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); - GSList *devices = NULL; - GSList *iter; + GSList *keep = NULL, *gone = NULL, *iter; /* Keep devices still known to HAL; get rid of ones HAL no longer knows about */ for (iter = priv->devices; iter; iter = iter->next) { @@ -1509,12 +1508,17 @@ sync_devices (NMManager *self) nm_device_set_managed (device, TRUE, NM_DEVICE_STATE_REASON_NOW_MANAGED); else nm_device_set_managed (device, FALSE, NM_DEVICE_STATE_REASON_NOW_UNMANAGED); - devices = g_slist_prepend (devices, device); + keep = g_slist_append (keep, device); } else - remove_one_device (self, device); + gone = g_slist_append (gone, device); } g_slist_free (priv->devices); - priv->devices = devices; + priv->devices = keep; + + /* Dispose of devices no longer present */ + for (iter = gone; iter; iter = g_slist_next (iter)) + remove_one_device (self, NM_DEVICE (iter->data)); + g_slist_free (gone); /* Ask HAL for new devices */ nm_hal_manager_query_devices (priv->hal_mgr);