From 44d48ebfc3f322dc73d6a0b7b2bf92bdb3e905ee Mon Sep 17 00:00:00 2001 From: Ondrej Holy Date: Tue, 13 Oct 2015 12:37:10 +0200 Subject: [PATCH] file monitor: Fix invalid read Commit 7373acf changed file monitor construction to be really synchronous. Unfortunately there is missing g_object_ref for d-bus connection and the connection is unrefed after use. Subsequent read of the unrefed connection cause crash with following critical: (firefox:29844): GLib-GIO-CRITICAL **: g_dbus_connection_is_closed: assertion 'G_IS_DBUS_CONNECTION (connection)' failed Do not store the connection, because it isn't neccesary with the synchronous construction. https://bugzilla.gnome.org/show_bug.cgi?id=756153 --- client/gdaemonfilemonitor.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/client/gdaemonfilemonitor.c b/client/gdaemonfilemonitor.c index 313b06f..2d9f958 100644 --- a/client/gdaemonfilemonitor.c +++ b/client/gdaemonfilemonitor.c @@ -46,7 +46,6 @@ struct _GDaemonFileMonitor char *object_path; char *remote_obj_path; char *remote_id; - GDBusConnection *connection; GVfsDBusMonitor *proxy; /* Non-null if we're subscribed */ GVfsDBusMonitorClient *skeleton; }; @@ -68,8 +67,6 @@ g_daemon_file_monitor_finalize (GObject* object) g_clear_object (&daemon_monitor->proxy); - g_clear_object (&daemon_monitor->connection); - g_free (daemon_monitor->object_path); g_free (daemon_monitor->remote_id); g_free (daemon_monitor->remote_obj_path); @@ -157,7 +154,6 @@ subscribe_cb (GVfsDBusMonitor *proxy, gvfs_dbus_monitor_call_unsubscribe (proxy, monitor->object_path, NULL, NULL, NULL); - g_clear_object (&monitor->connection); g_object_unref (monitor); return; } @@ -181,8 +177,8 @@ g_daemon_file_monitor_new (const char *remote_id, daemon_monitor->remote_id = g_strdup (remote_id); daemon_monitor->remote_obj_path = g_strdup (remote_obj_path); - daemon_monitor->connection = _g_dbus_connection_get_sync (daemon_monitor->remote_id, NULL, &error); - if (daemon_monitor->connection == NULL) + connection = _g_dbus_connection_get_sync (daemon_monitor->remote_id, NULL, &error); + if (connection == NULL) { g_printerr ("Error getting connection for monitoring: %s (%s, %d)\n", error->message, g_quark_to_string (error->domain), error->code); @@ -191,7 +187,7 @@ g_daemon_file_monitor_new (const char *remote_id, else { if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (daemon_monitor->skeleton), - daemon_monitor->connection, + connection, daemon_monitor->object_path, &error)) { @@ -202,7 +198,7 @@ g_daemon_file_monitor_new (const char *remote_id, /* This looks like a sync call, but since the remote_id is a unique id we don't actually send any messages */ - proxy = gvfs_dbus_monitor_proxy_new_sync (daemon_monitor->connection, + proxy = gvfs_dbus_monitor_proxy_new_sync (connection, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, daemon_monitor->remote_id, daemon_monitor->remote_obj_path, -- 2.5.0