summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2009-03-13 13:09:19 +0000
committerAlexander Larsson <alexl@src.gnome.org>2009-03-13 13:09:19 +0000
commit0cb1b15911b93436ffe98f6ad903d4a48f6e8005 (patch)
treeb10035992d50685df96f0300fcd120835cbf2aa2
parent831988747f7ed76a319c272eb3ae442001aff81d (diff)
downloadgvfs-0cb1b15911b93436ffe98f6ad903d4a48f6e8005.tar.gz
Bug 563418 – gvfs backend leaks monitors
2009-03-13 Alexander Larsson <alexl@redhat.com> Bug 563418 – gvfs backend leaks monitors * daemon/gvfsmonitor.c: (unsubscribe): (vfs_monitor_message_callback): Fix crashes when unsubscribing monitors. svn path=/trunk/; revision=2322
-rw-r--r--ChangeLog9
-rw-r--r--daemon/gvfsmonitor.c8
2 files changed, 14 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 8632cc3f..1db239bd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2009-03-13 Alexander Larsson <alexl@redhat.com>
+ Bug 563418 – gvfs backend leaks monitors
+
+ * daemon/gvfsmonitor.c:
+ (unsubscribe):
+ (vfs_monitor_message_callback):
+ Fix crashes when unsubscribing monitors.
+
+2009-03-13 Alexander Larsson <alexl@redhat.com>
+
* daemon/daemon-main.c (daemon_parse_args):
Enable debug output if GVFS_DEBUG is set in the environment.
diff --git a/daemon/gvfsmonitor.c b/daemon/gvfsmonitor.c
index df678039..4b91ecef 100644
--- a/daemon/gvfsmonitor.c
+++ b/daemon/gvfsmonitor.c
@@ -150,14 +150,13 @@ static void
unsubscribe (GVfsMonitor *monitor,
Subscriber *subscriber)
{
+ monitor->priv->subscribers = g_list_remove (monitor->priv->subscribers, subscriber);
+
dbus_connection_unref (subscriber->connection);
g_free (subscriber->id);
g_free (subscriber->object_path);
g_free (subscriber);
g_object_unref (monitor);
-
- monitor->priv->subscribers = g_list_remove (monitor->priv->subscribers, subscriber);
-
}
static DBusHandlerResult
@@ -222,6 +221,7 @@ vfs_monitor_message_callback (DBusConnection *connection,
}
else
{
+ g_object_ref (monitor); /* Keep alive during possible last remove */
for (l = monitor->priv->subscribers; l != NULL; l = l->next)
{
subscriber = l->data;
@@ -238,6 +238,8 @@ vfs_monitor_message_callback (DBusConnection *connection,
reply = dbus_message_new_method_return (message);
dbus_connection_send (connection, reply, NULL);
+
+ g_object_unref (monitor);
}
return DBUS_HANDLER_RESULT_HANDLED;