[liboobs] Fix memory leaks
- From: Milan Bouchet-Valat <milanbv src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [liboobs] Fix memory leaks
- Date: Mon, 8 Feb 2010 23:01:53 +0000 (UTC)
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]