On Thu, 2009-03-05 at 15:15 -0700, Drew Moseley wrote:
> Dan Williams wrote:
> > I looked over the code there again, and it's correct AFAICT.
> > g_slist_delete_link() in the sync_devices() function should be doing
> > what its intended to do; it removes one link from the linked list
> > priv->devices and frees the link.  It doesn't free the data of course,
> > but that should get correctly unref-ed right below.  And after that, the
> > device should no longer be in priv->devices at all.  That doesn't mean
> > there isn't a refcounting bug, but I'm still not quite sure what's
> > causing the invalid access later on...
> 
> Hi Dan,
> 
> Looks like the issue is that the delete_link call is incorrect since the node 
> being passed in is from the copy of the list.  The patch below addresses this 
> by building the new list by adding the items that exist and then deleting the 
> old list.
> 
> Thoughts?

Excellent catch.  Thanks!  Will commit.

Dan

> Drew
> 
> 
> diff --git a/src/nm-manager.c b/src/nm-manager.c
> index 30660f1..9a8c1e8 100644
> --- a/src/nm-manager.c
> +++ b/src/nm-manager.c
> @@ -1479,12 +1479,11 @@ static void
>  sync_devices (NMManager *self)
>  {
>       NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
> -     GSList *devices;
> +     GSList *devices = NULL;
>       GSList *iter;
>  
>       /* Remove devices which are no longer known to HAL */
> -     devices = g_slist_copy (priv->devices);
> -     for (iter = devices; iter; iter = iter->next) {
> +     for (iter = priv->devices; iter; iter = iter->next) {
>               NMDevice *device = NM_DEVICE (iter->data);
>               const char *udi = nm_device_get_udi (device);
>  
> @@ -1493,13 +1492,14 @@ 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);
>               } else {
> -                     priv->devices = g_slist_delete_link (priv->devices, 
> iter);
>                       remove_one_device (self, device);
>               }
>       }
>  
> -     g_slist_free (devices);
> +     g_slist_free (priv->devices);
> +     priv->devices = devices;
>  
>       /* Get any new ones */
>       nm_hal_manager_query_devices (priv->hal_mgr);
> 

_______________________________________________
NetworkManager-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to