[gdm/rhel-7.9: 26/51] manager: Don't leak session objects




commit 10b76a4f54c2acc368062f279a0025689c5b230b
Author: Ray Strode <rstrode redhat com>
Date:   Mon Sep 14 16:20:09 2020 -0400

    manager: Don't leak session objects
    
    The first is from create_user_session_for display.  Most callers don't
    check the return value, so it should just be void.
    
    The user data associated with the session also isn't unlinked from the
    display when the display is finishing up, preventing the display and
    session object from getting freed.
    
    This commit makes both changes.

 daemon/gdm-manager.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)
---
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index d31c9d718..89983d530 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -121,9 +121,9 @@ static void     gdm_manager_class_init  (GdmManagerClass *klass);
 static void     gdm_manager_init        (GdmManager      *manager);
 static void     gdm_manager_dispose     (GObject         *object);
 
-static GdmSession *create_user_session_for_display (GdmManager *manager,
-                                                    GdmDisplay *display,
-                                                    uid_t       allowed_user);
+static void     create_user_session_for_display (GdmManager *manager,
+                                                 GdmDisplay *display,
+                                                 uid_t       allowed_user);
 static void     start_user_session (GdmManager                *manager,
                                     StartUserSessionOperation *operation);
 static void     clean_user_session (GdmSession *session);
@@ -1466,7 +1466,8 @@ set_up_automatic_login_session (GdmManager *manager,
         /* 0 is root user; since the daemon talks to the session object
          * directly, itself, for automatic login
          */
-        session = create_user_session_for_display (manager, display, 0);
+        create_user_session_for_display (manager, display, 0);
+        session = get_user_session_for_display (display);
 
         g_object_get (G_OBJECT (display),
                       "is-initial", &is_initial,
@@ -1682,6 +1683,8 @@ on_display_status_changed (GdmDisplay *display,
                         }
 #endif
 
+                        g_object_set_data (G_OBJECT (display), "gdm-user-session", NULL);
+
                         if (status == GDM_DISPLAY_FINISHED || g_strcmp0 (session_type, "x11") == 0) {
                                 manager->priv->ran_once = TRUE;
                         }
@@ -2321,7 +2324,7 @@ clean_user_session (GdmSession *session)
         g_object_unref (session);
 }
 
-static GdmSession *
+static void
 create_user_session_for_display (GdmManager *manager,
                                  GdmDisplay *display,
                                  uid_t       allowed_user)
@@ -2425,7 +2428,7 @@ create_user_session_for_display (GdmManager *manager,
         g_object_set_data (G_OBJECT (session), "gdm-display", display);
         g_object_set_data_full (G_OBJECT (display),
                                 "gdm-user-session",
-                                g_object_ref (session),
+                                session,
                                 (GDestroyNotify)
                                 clean_user_session);
 
@@ -2433,8 +2436,6 @@ create_user_session_for_display (GdmManager *manager,
         greeter_is_wayland = g_strcmp0 (display_session_type, "wayland") == 0;
         g_object_set (G_OBJECT (session), "ignore-wayland", !greeter_is_wayland, NULL);
 #endif
-
-        return session;
 }
 
 static void


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