Blame SOURCES/0001-daemon-gdm-session-record.c-open-close-the-utmp-data.patch

765e07
From 086d68f24d984fb48e44aa16aa815825cd5ed0bc Mon Sep 17 00:00:00 2001
765e07
From: Jason Pleau <jason@jpleau.ca>
765e07
Date: Wed, 30 May 2018 21:48:22 -0400
765e07
Subject: [PATCH] daemon/gdm-session-record.c: open/close the utmp database
765e07
765e07
pututxline() was used without first opening the utxmp database and
765e07
without closing it, preventing the logout entry from being fully
765e07
committed.
765e07
765e07
This caused the number of logged-in users to increment after each login,
765e07
as logging out did not correctly remove the user login record from utmp.
765e07
765e07
This commit wraps pututxline() between setutxent() and endutxent(),
765e07
making sure that the login/logout operation are fully flushed.
765e07
765e07
Fixes #381
765e07
---
765e07
 daemon/gdm-session-record.c | 4 ++++
765e07
 1 file changed, 4 insertions(+)
765e07
765e07
diff --git a/daemon/gdm-session-record.c b/daemon/gdm-session-record.c
765e07
index 487f10047..d2df58873 100644
765e07
--- a/daemon/gdm-session-record.c
765e07
+++ b/daemon/gdm-session-record.c
765e07
@@ -186,104 +186,108 @@ gdm_session_record_login (GPid                  session_pid,
765e07
 
765e07
         g_debug ("Writing login record");
765e07
 
765e07
 #if defined(HAVE_UT_UT_TYPE)
765e07
         session_record.ut_type = USER_PROCESS;
765e07
         g_debug ("using ut_type USER_PROCESS");
765e07
 #endif
765e07
 
765e07
         record_set_timestamp (&session_record);
765e07
         record_set_pid (&session_record, session_pid);
765e07
         record_set_host (&session_record, x11_display_name, host_name);
765e07
         record_set_line (&session_record, display_device, x11_display_name);
765e07
 
765e07
         /* Handle wtmp */
765e07
         g_debug ("Writing wtmp session record to " GDM_NEW_SESSION_RECORDS_FILE);
765e07
 #if defined(HAVE_UPDWTMPX)
765e07
         updwtmpx (GDM_NEW_SESSION_RECORDS_FILE, &session_record);
765e07
 #elif defined(HAVE_UPDWTMP)
765e07
         updwtmp (GDM_NEW_SESSION_RECORDS_FILE, &session_record);
765e07
 #elif defined(HAVE_LOGWTMP) && defined(HAVE_UT_UT_HOST)
765e07
 #if defined(HAVE_UT_UT_USER)
765e07
         logwtmp (session_record.ut_line, session_record.ut_user, session_record.ut_host);
765e07
 #elif defined(HAVE_UT_UT_NAME)
765e07
         logwtmp (session_record.ut_line, session_record.ut_name, session_record.ut_host);
765e07
 #endif
765e07
 #endif
765e07
 
765e07
         /* Handle utmp */
765e07
 #if defined(HAVE_GETUTXENT)
765e07
         g_debug ("Adding or updating utmp record for login");
765e07
+        setutxent();
765e07
         pututxline (&session_record);
765e07
+        endutxent();
765e07
 #elif defined(HAVE_LOGIN)
765e07
 	login (&session_record);
765e07
 #endif
765e07
 }
765e07
 
765e07
 void
765e07
 gdm_session_record_logout (GPid                  session_pid,
765e07
                            const char           *user_name,
765e07
                            const char           *host_name,
765e07
                            const char           *x11_display_name,
765e07
                            const char           *display_device)
765e07
 {
765e07
         UTMP        session_record = { 0 };
765e07
 
765e07
         if (x11_display_name == NULL)
765e07
                 x11_display_name = display_device;
765e07
 
765e07
         g_debug ("Writing logout record");
765e07
 
765e07
 #if defined(HAVE_UT_UT_TYPE)
765e07
         session_record.ut_type = DEAD_PROCESS;
765e07
         g_debug ("using ut_type DEAD_PROCESS");
765e07
 #endif
765e07
 
765e07
         record_set_timestamp (&session_record);
765e07
         record_set_pid (&session_record, session_pid);
765e07
         record_set_host (&session_record, x11_display_name, host_name);
765e07
         record_set_line (&session_record, display_device, x11_display_name);
765e07
 
765e07
         /* Handle wtmp */
765e07
         g_debug ("Writing wtmp logout record to " GDM_NEW_SESSION_RECORDS_FILE);
765e07
 #if defined(HAVE_UPDWTMPX)
765e07
         updwtmpx (GDM_NEW_SESSION_RECORDS_FILE, &session_record);
765e07
 #elif defined (HAVE_UPDWTMP)
765e07
         updwtmp (GDM_NEW_SESSION_RECORDS_FILE, &session_record);
765e07
 #elif defined(HAVE_LOGWTMP)
765e07
         logwtmp (session_record.ut_line, "", "");
765e07
 #endif
765e07
 
765e07
         /* Handle utmp */
765e07
 #if defined(HAVE_GETUTXENT)
765e07
         g_debug ("Adding or updating utmp record for logout");
765e07
+        setutxent();
765e07
         pututxline (&session_record);
765e07
+        endutxent();
765e07
 #elif defined(HAVE_LOGOUT)
765e07
         logout (session_record.ut_line);
765e07
 #endif
765e07
 }
765e07
 
765e07
 void
765e07
 gdm_session_record_failed (GPid                  session_pid,
765e07
                            const char           *user_name,
765e07
                            const char           *host_name,
765e07
                            const char           *x11_display_name,
765e07
                            const char           *display_device)
765e07
 {
765e07
         UTMP        session_record = { 0 };
765e07
 
765e07
         if (x11_display_name == NULL)
765e07
                 x11_display_name = display_device;
765e07
 
765e07
         record_set_username (&session_record, user_name);
765e07
 
765e07
         g_debug ("Writing failed session attempt record");
765e07
 
765e07
 #if defined(HAVE_UT_UT_TYPE)
765e07
         session_record.ut_type = USER_PROCESS;
765e07
         g_debug ("using ut_type USER_PROCESS");
765e07
 #endif
765e07
 
765e07
         record_set_timestamp (&session_record);
765e07
         record_set_pid (&session_record, session_pid);
765e07
         record_set_host (&session_record, x11_display_name, host_name);
765e07
         record_set_line (&session_record, display_device, x11_display_name);
765e07
-- 
765e07
2.17.1
765e07