summaryrefslogtreecommitdiff
path: root/daemon/gdm-session.c
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2015-11-13 11:14:59 -0500
committerRay Strode <rstrode@redhat.com>2015-11-15 13:54:17 -0500
commit5ac224602f1d603aac5eaa72e1760d3e33a26f0a (patch)
tree15c57a76a503aea40ef5ef513c0469a102e88e59 /daemon/gdm-session.c
parentaf5957ad94095f97b09608440fbb201a2128be31 (diff)
downloadgdm-5ac224602f1d603aac5eaa72e1760d3e33a26f0a.tar.gz
session: disconnect signals from worker proxy when conversation is freed
We don't want an outstanding reference on the worker proxy to lead to signal handlers getting dispatched after the conversation is freed. https://bugzilla.gnome.org/show_bug.cgi?id=758032
Diffstat (limited to 'daemon/gdm-session.c')
-rw-r--r--daemon/gdm-session.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 1d0de889..1eff3d18 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -1678,7 +1678,28 @@ free_conversation (GdmSessionConversation *conversation)
g_free (conversation->starting_username);
g_free (conversation->session_id);
g_clear_object (&conversation->worker_manager_interface);
- g_clear_object (&conversation->worker_proxy);
+
+ if (conversation->worker_proxy != NULL) {
+ g_signal_handlers_disconnect_by_func (conversation->worker_proxy,
+ G_CALLBACK (worker_on_username_changed),
+ conversation);
+ g_signal_handlers_disconnect_by_func (conversation->worker_proxy,
+ G_CALLBACK (worker_on_session_exited),
+ conversation);
+ g_signal_handlers_disconnect_by_func (conversation->worker_proxy,
+ G_CALLBACK (worker_on_reauthenticated),
+ conversation);
+ g_signal_handlers_disconnect_by_func (conversation->worker_proxy,
+ G_CALLBACK (worker_on_saved_language_name_read),
+ conversation);
+ g_signal_handlers_disconnect_by_func (conversation->worker_proxy,
+ G_CALLBACK (worker_on_saved_session_name_read),
+ conversation);
+ g_signal_handlers_disconnect_by_func (conversation->worker_proxy,
+ G_CALLBACK (worker_on_cancel_pending_query),
+ conversation);
+ g_clear_object (&conversation->worker_proxy);
+ }
g_clear_object (&conversation->session);
g_free (conversation);
}