7e93001
commit 21defe6d73853bf19c6ce99d07701d1531e09409
7e93001
Author: Drew Moseley <dmoseley@mvista.com>
7e93001
Date:   Fri Mar 6 17:19:17 2009 -0500
7e93001
7e93001
    core: fix use-after-free caused by incorrect HAL device resync code
7e93001
7e93001
diff --git a/src/nm-manager.c b/src/nm-manager.c
7e93001
index a6bac55..d0e5564 100644
7e93001
--- a/src/nm-manager.c
7e93001
+++ b/src/nm-manager.c
7e93001
@@ -1426,12 +1426,11 @@ static void
7e93001
 sync_devices (NMManager *self)
7e93001
 {
7e93001
 	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
7e93001
-	GSList *devices;
7e93001
+	GSList *devices = NULL;
7e93001
 	GSList *iter;
7e93001
 
7e93001
-	/* Remove devices which are no longer known to HAL */
7e93001
-	devices = g_slist_copy (priv->devices);
7e93001
-	for (iter = devices; iter; iter = iter->next) {
7e93001
+	/* Keep devices still known to HAL; get rid of ones HAL no longer knows about */
7e93001
+	for (iter = priv->devices; iter; iter = iter->next) {
7e93001
 		NMDevice *device = NM_DEVICE (iter->data);
7e93001
 		const char *udi = nm_device_get_udi (device);
7e93001
 
7e93001
@@ -1440,15 +1439,14 @@ sync_devices (NMManager *self)
7e93001
 				nm_device_set_managed (device, TRUE, NM_DEVICE_STATE_REASON_NOW_MANAGED);
7e93001
 			else
7e93001
 				nm_device_set_managed (device, FALSE, NM_DEVICE_STATE_REASON_NOW_UNMANAGED);
7e93001
-		} else {
7e93001
-			priv->devices = g_slist_delete_link (priv->devices, iter);
7e93001
+			devices = g_slist_prepend (devices, device);
7e93001
+		} else
7e93001
 			remove_one_device (self, device);
7e93001
-		}
7e93001
 	}
7e93001
+	g_slist_free (priv->devices);
7e93001
+	priv->devices = devices;
7e93001
 
7e93001
-	g_slist_free (devices);
7e93001
-
7e93001
-	/* Get any new ones */
7e93001
+	/* Ask HAL for new devices */
7e93001
 	nm_hal_manager_query_devices (priv->hal_mgr);
7e93001
 }
7e93001