[gdm/gnome-3-18] session: disconnect signals from worker proxy when conversation is freed



commit 40bbaff5274d499b931037e7adb28683ff1f02b5
Author: Ray Strode <rstrode redhat com>
Date:   Fri Nov 13 11:14:59 2015 -0500

    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

 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 982b5eb..72f79cd 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -1675,7 +1675,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);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]