[liboobs] Fix memory leaks



commit a35d0e8efd3626abbb5dfe2800cbb888fd6577a2
Author: Milan Bouchet-Valat <nalimilan club fr>
Date:   Mon Feb 8 22:56:35 2010 +0100

    Fix memory leaks
    
    Remove _oobs_session_(un)register_object(), which was used to prevent objects from being destroyed while the session exists. We now use the inverse model: objects keep a reference on the session object, and let it die after they have been destroyed. Keeping references on those objects was preventing OobsUsers from ever being freed.
    
    Fix a crash happening in finalize() when password was NULL, made possible by the above change.
    
    Fix a few places where unreferencing wasn't called or not in all needed cases. Some fixes still need to be done, notably for circular references.

 oobs/oobs-group.c           |    7 ++--
 oobs/oobs-object.c          |    5 ---
 oobs/oobs-session-private.h |    5 ---
 oobs/oobs-session.c         |   76 +------------------------------------------
 oobs/oobs-user.c            |    9 +++--
 oobs/oobs-usersconfig.c     |   18 +++++++---
 6 files changed, 22 insertions(+), 98 deletions(-)
---
diff --git a/oobs/oobs-group.c b/oobs/oobs-group.c
index 6c68de4..193d2d9 100644
--- a/oobs/oobs-group.c
+++ b/oobs/oobs-group.c
@@ -264,8 +264,10 @@ oobs_group_finalize (GObject *object)
       g_list_free (priv->users);
 
       /* Erase password field in case it's not done */
-      memset (priv->password, 0, strlen (priv->password));
-      g_free (priv->password);
+      if (priv->password) {
+	memset (priv->password, 0, strlen (priv->password));
+	g_free (priv->password);
+      }
     }
 
   if (G_OBJECT_CLASS (oobs_group_parent_class)->finalize)
@@ -359,7 +361,6 @@ oobs_group_commit (OobsObject *object)
   /* Erase password field as soon as possible */
   priv = OOBS_GROUP_GET_PRIVATE (OOBS_GROUP (object));
   memset (priv->password, 0, strlen (priv->password));
-  g_free (priv->password);
 }
 
 /*
diff --git a/oobs/oobs-object.c b/oobs/oobs-object.c
index 2145fa7..696ce06 100644
--- a/oobs/oobs-object.c
+++ b/oobs/oobs-object.c
@@ -190,11 +190,7 @@ oobs_object_finalize (GObject *object)
   g_list_foreach (priv->pending_calls, (GFunc) dbus_pending_call_unref, NULL);
   g_list_free (priv->pending_calls);
 
-  _oobs_session_unregister_object (priv->session, obj);
-
-  /* Only now, we don't care about session */
   g_object_unref (priv->session);
-
   g_free (priv->remote_object);
   g_free (priv->path);
   g_free (priv->method);
@@ -288,7 +284,6 @@ connect_object_to_session (OobsObject *object)
       return;
     }
 
-  _oobs_session_register_object (priv->session, object);
   dbus_connection_add_filter (connection, changed_signal_filter, object, NULL);
 
   rule = g_strdup_printf ("type='signal',interface='%s',path='%s'",
diff --git a/oobs/oobs-session-private.h b/oobs/oobs-session-private.h
index f23111a..2a5d2fb 100644
--- a/oobs/oobs-session-private.h
+++ b/oobs/oobs-session-private.h
@@ -32,11 +32,6 @@ G_BEGIN_DECLS
 
 DBusConnection* _oobs_session_get_connection_bus (OobsSession *session);
 
-void            _oobs_session_register_object    (OobsSession *session,
-						  OobsObject  *object);
-void            _oobs_session_unregister_object  (OobsSession *session,
-						  OobsObject  *object);
-
 G_END_DECLS
 
 #endif /* __OOBS_SESSION_PRIVATE_H */
diff --git a/oobs/oobs-session.c b/oobs/oobs-session.c
index b6bdb41..8390179 100644
--- a/oobs/oobs-session.c
+++ b/oobs/oobs-session.c
@@ -55,7 +55,6 @@ struct _OobsSessionPrivate
 
 static void oobs_session_class_init (OobsSessionClass *class);
 static void oobs_session_init       (OobsSession      *session);
-static void oobs_session_finalize   (GObject         *object);
 
 static GObject * oobs_session_constructor (GType                  type,
 					   guint                  n_construct_properties,
@@ -69,6 +68,7 @@ static void oobs_session_get_property (GObject      *object,
 				       guint         prop_id,
 				       GValue       *value,
 				       GParamSpec   *pspec);
+
 enum
 {
   PROP_0,
@@ -85,7 +85,6 @@ oobs_session_class_init (OobsSessionClass *class)
   object_class->constructor  = oobs_session_constructor;
   object_class->set_property = oobs_session_set_property;
   object_class->get_property = oobs_session_get_property;
-  object_class->finalize     = oobs_session_finalize;
 
   g_object_class_install_property (object_class,
 				   PROP_PLATFORM,
@@ -119,40 +118,6 @@ oobs_session_init (OobsSession *session)
   session->_priv = priv;
 }
 
-static void
-unregister_object_node (OobsSessionPrivate *priv, GList *node)
-{
-  priv->session_objects = g_list_remove_link (priv->session_objects, node);
-
-  g_object_unref (G_OBJECT (node->data));
-  g_list_free_1 (node);
-}
-
-static void
-unregister_objects_list (OobsSessionPrivate *priv)
-{
-  while (priv->session_objects)
-    unregister_object_node (priv, priv->session_objects);
-}
-
-static void
-oobs_session_finalize (GObject *object)
-{
-  OobsSession *session;
-  OobsSessionPrivate *priv;
-
-  g_return_if_fail (OOBS_IS_SESSION (object));
-
-  session = OOBS_SESSION (object);
-  priv    = session->_priv;
-
-  if (priv)
-    unregister_objects_list (priv);
-
-  if (G_OBJECT_CLASS (oobs_session_parent_class)->finalize)
-    (* G_OBJECT_CLASS (oobs_session_parent_class)->finalize) (object);
-}
-
 static GObject *
 oobs_session_constructor (GType                  type,
 			  guint                  n_construct_properties,
@@ -548,42 +513,3 @@ _oobs_session_get_connection_bus (OobsSession *session)
   priv = session->_priv;
   return priv->connection;
 }
-
-void
-_oobs_session_register_object (OobsSession *session, OobsObject *object)
-{
-  OobsSessionPrivate *priv;
-
-  if (!session || !object)
-    return;
-
-  priv = session->_priv;
-  priv->session_objects = g_list_prepend (priv->session_objects,
-					  g_object_ref (object));
-}
-
-void
-_oobs_session_unregister_object (OobsSession *session, OobsObject *object)
-{
-  OobsSessionPrivate *priv;
-  GList              *node;
-  gboolean            found;
-
-  if (!session || !object)
-    return;
-
-  priv  = session->_priv;
-  node  = priv->session_objects;
-  found = FALSE;
-
-  while (node && !found)
-    {
-      if (node->data == object)
-        {
-	  found = TRUE;
-	  unregister_object_node (priv, node);
-	}
-      else
-	node = node->next;
-    }
-}
diff --git a/oobs/oobs-user.c b/oobs/oobs-user.c
index 03bddaf..828a801 100644
--- a/oobs/oobs-user.c
+++ b/oobs/oobs-user.c
@@ -447,9 +447,11 @@ oobs_user_finalize (GObject *object)
       if (priv->main_group)
 	g_object_unref (priv->main_group);
 
-      /* Erase password field in case it's not done */
-      memset (priv->password, 0, strlen (priv->password));
-      g_free (priv->password);
+      /* Erase password field in case it's not done yet */
+      if (priv->password) {
+	memset (priv->password, 0, strlen (priv->password));
+	g_free (priv->password);
+      }
     }
 
   if (G_OBJECT_CLASS (oobs_user_parent_class)->finalize)
@@ -628,7 +630,6 @@ oobs_user_commit (OobsObject *object)
   /* Erase password field as soon as possible */
   priv = OOBS_USER_GET_PRIVATE (OOBS_USER (object));
   memset (priv->password, 0, strlen (priv->password));
-  g_free (priv->password);
 }
 
 /*
diff --git a/oobs/oobs-usersconfig.c b/oobs/oobs-usersconfig.c
index da4c40a..bb0cbbf 100644
--- a/oobs/oobs-usersconfig.c
+++ b/oobs/oobs-usersconfig.c
@@ -172,10 +172,10 @@ oobs_users_config_init (OobsUsersConfig *config)
   priv->users_list = _oobs_list_new (OOBS_TYPE_USER);
   config->_priv = priv;
 
-  priv->groups = g_hash_table_new_full (NULL, NULL, g_object_unref, NULL);
+  priv->groups = g_hash_table_new (NULL, NULL);
 }
 
-static void
+void
 free_configuration (OobsUsersConfig *config)
 {
   OobsUsersConfigPrivate *priv;
@@ -351,15 +351,15 @@ oobs_users_config_update (OobsObject *object)
       oobs_list_append (priv->users_list, &list_iter);
       oobs_list_set    (priv->users_list, &list_iter, G_OBJECT (user));
 
+      g_object_unref (user);
+
       /* keep the group name in a hashtable, this will be needed
        * each time the groups configuration changes
        */
       g_hash_table_insert (priv->groups,
-                           g_object_ref (user),
+                           user,
                            (gpointer) gid);
 
-      g_object_unref (user);
-
       dbus_message_iter_next (&elem_iter);
     }
 
@@ -533,6 +533,8 @@ oobs_users_config_delete_user (OobsUsersConfig *config, OobsUser *user)
 
     oobs_group_remove_user (group, user);
 
+    g_object_unref (group);
+
     valid = oobs_list_iter_next (priv->users_list, &list_iter);
   }
 
@@ -543,8 +545,12 @@ oobs_users_config_delete_user (OobsUsersConfig *config, OobsUser *user)
   while (valid) {
     list_user = OOBS_USER (oobs_list_get (priv->users_list, &list_iter));
 
-    if (list_user == user)
+    if (list_user == user) {
+      g_object_unref (list_user);
       break;
+    }
+
+    g_object_unref (list_user);
 
     valid = oobs_list_iter_next (priv->users_list, &list_iter);
   }



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