Blame SOURCES/fix-infinite-recursion.patch

01018b
From 199c86579be9f674bdfd53e75a226b7a2d312d31 Mon Sep 17 00:00:00 2001
01018b
From: Ray Strode <rstrode@redhat.com>
01018b
Date: Mon, 16 Dec 2013 16:57:19 -0500
01018b
Subject: [PATCH] slave: fix infinite loop on shutdown
01018b
01018b
we stop something that calls stop in some circumstances.
01018b
01018b
This commit breaks the loop.
01018b
01018b
https://bugzilla.gnome.org/show_bug.cgi?id=712767
01018b
---
01018b
 daemon/gdm-simple-slave.c | 19 +++++++++++++++++--
01018b
 1 file changed, 17 insertions(+), 2 deletions(-)
01018b
01018b
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
01018b
index 1fe58bc..d83216b 100644
01018b
--- a/daemon/gdm-simple-slave.c
01018b
+++ b/daemon/gdm-simple-slave.c
01018b
@@ -1641,62 +1641,77 @@ gdm_simple_slave_open_reauthentication_channel (GdmSlave             *slave,
01018b
                                      g_object_ref (result));
01018b
 
01018b
                 gdm_session_start_reauthentication (self->priv->session,
01018b
                                                     pid_of_caller,
01018b
                                                     uid_of_caller);
01018b
         }
01018b
 
01018b
         g_object_unref (result);
01018b
 }
01018b
 
01018b
 static gboolean
01018b
 gdm_simple_slave_start (GdmSlave *slave)
01018b
 {
01018b
         GDM_SLAVE_CLASS (gdm_simple_slave_parent_class)->start (slave);
01018b
 
01018b
         gdm_simple_slave_run (GDM_SIMPLE_SLAVE (slave));
01018b
 
01018b
         return TRUE;
01018b
 }
01018b
 
01018b
 static gboolean
01018b
 gdm_simple_slave_stop (GdmSlave *slave)
01018b
 {
01018b
         GdmSimpleSlave *self = GDM_SIMPLE_SLAVE (slave);
01018b
 
01018b
         g_debug ("GdmSimpleSlave: Stopping simple_slave");
01018b
 
01018b
         GDM_SLAVE_CLASS (gdm_simple_slave_parent_class)->stop (slave);
01018b
 
01018b
         if (self->priv->greeter_environment != NULL) {
01018b
-                stop_greeter (self);
01018b
-                self->priv->greeter_environment = NULL;
01018b
+                g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->greeter_environment),
01018b
+                                                      G_CALLBACK (on_greeter_environment_session_opened),
01018b
+                                                      self);
01018b
+                g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->greeter_environment),
01018b
+                                                      G_CALLBACK (on_greeter_environment_session_started),
01018b
+                                                      self);
01018b
+                g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->greeter_environment),
01018b
+                                                      G_CALLBACK (on_greeter_environment_session_stopped),
01018b
+                                                      self);
01018b
+                g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->greeter_environment),
01018b
+                                                      G_CALLBACK (on_greeter_environment_session_exited),
01018b
+                                                      self);
01018b
+                g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->greeter_environment),
01018b
+                                                      G_CALLBACK (on_greeter_environment_session_died),
01018b
+                                                      self);
01018b
+                gdm_launch_environment_stop (GDM_LAUNCH_ENVIRONMENT (self->priv->greeter_environment));
01018b
+                g_clear_object (&self->priv->greeter_environment);
01018b
         }
01018b
 
01018b
         if (self->priv->start_session_id > 0) {
01018b
                 g_source_remove (self->priv->start_session_id);
01018b
                 self->priv->start_session_id = 0;
01018b
         }
01018b
 
01018b
         g_clear_pointer (&self->priv->start_session_service_name,
01018b
                          (GDestroyNotify) g_free);
01018b
 
01018b
         if (self->priv->session_is_running) {
01018b
                 char *username;
01018b
 
01018b
                 /* Run the PostSession script. gdmslave suspends until script
01018b
                  * has terminated
01018b
                  */
01018b
                 username = gdm_session_get_username (self->priv->session);
01018b
                 if (username != NULL) {
01018b
                         gdm_slave_run_script (slave, GDMCONFDIR "/PostSession", username);
01018b
                 }
01018b
                 g_free (username);
01018b
 
01018b
 #ifdef  HAVE_LOGINDEVPERM
01018b
                 gdm_simple_slave_revoke_console_permissions (self);
01018b
 #endif
01018b
 
01018b
                 self->priv->session_is_running = FALSE;
01018b
         }
01018b
 
01018b
         if (self->priv->session != NULL) {
01018b
-- 
01018b
1.8.4.2
01018b