diff options
author | Ray Strode <rstrode@redhat.com> | 2015-11-13 11:14:59 -0500 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2015-11-15 13:54:17 -0500 |
commit | 5ac224602f1d603aac5eaa72e1760d3e33a26f0a (patch) | |
tree | 15c57a76a503aea40ef5ef513c0469a102e88e59 | |
parent | af5957ad94095f97b09608440fbb201a2128be31 (diff) | |
download | gdm-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.c | 23 |
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); } |