summaryrefslogtreecommitdiff
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
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
-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);
}