[liboobs] Fix crash when groups have been updated



commit d8226ae531fe52e62685d7de2cbc5489b8be7d6d
Author: Milan Bouchet-Valat <nalimilan club fr>
Date:   Sat Feb 13 22:55:14 2010 +0100

    Fix crash when groups have been updated
    
    After an update, OobsGroups that no longer existed were still receiving "updated" event from OobsUsersConfig, leading to crash. Ensure we disconnect the handler on finalize().

 oobs/oobs-group.c |   20 +++++++++++++++++---
 1 files changed, 17 insertions(+), 3 deletions(-)
---
diff --git a/oobs/oobs-group.c b/oobs/oobs-group.c
index f10ceff..c626458 100644
--- a/oobs/oobs-group.c
+++ b/oobs/oobs-group.c
@@ -48,10 +48,12 @@ typedef struct _OobsGroupPrivate OobsGroupPrivate;
 
 struct _OobsGroupPrivate {
   OobsObject *config;
+  OobsObject *users_config;
   gint   key;
   gchar *groupname;
   gchar *password;
   gid_t  gid;
+  gulong updated_id;
 
   /* List of names received from the backends, possibly with unknown users */
   GList *usernames;
@@ -141,6 +143,7 @@ oobs_group_init (OobsGroup *group)
   priv->config    = oobs_groups_config_get ();
   priv->groupname = NULL;
   priv->password  = NULL;
+  priv->updated_id = 0;
   priv->usernames = NULL;
   priv->users     = NULL;
 
@@ -178,9 +181,17 @@ oobs_group_users_updated (OobsGroup        *group,
 static void
 oobs_group_constructed (GObject *object)
 {
-  /* stay tuned of changes in users config */
-  g_signal_connect_swapped (oobs_users_config_get (), "updated",
-                            G_CALLBACK (oobs_group_users_updated), object);
+  OobsGroupPrivate *priv;
+
+  priv = OOBS_GROUP_GET_PRIVATE (OOBS_GROUP (object));
+
+  /* Be notified when users config is destroyed, to avoid disconnecting signal in finalize() */
+  priv->users_config = oobs_users_config_get ();
+  g_object_add_weak_pointer (G_OBJECT (priv->users_config), (gpointer) &priv->users_config);
+
+  /* Stay tuned of changes in users config */
+  priv->updated_id = g_signal_connect_swapped (priv->users_config, "updated",
+                                               G_CALLBACK (oobs_group_users_updated), object);
 }
 
 static void
@@ -255,6 +266,9 @@ oobs_group_finalize (GObject *object)
 
   if (priv)
     {
+      if (priv->users_config)
+	g_signal_handler_disconnect (priv->users_config, priv->updated_id);
+
       g_free (priv->groupname);
 
       g_list_foreach (priv->usernames, (GFunc) g_free, NULL);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]