gdm package update
Signed-off-by: guibuilder_pel7x64builder0 <guibuilder@powerel.org>master
parent
af396ae821
commit
a8a1f06c87
|
@ -1,4 +1,4 @@
|
||||||
From cbddcc7c8cc8dcccc8c9a616e1decf8a3ed1cb87 Mon Sep 17 00:00:00 2001
|
From c35c3fa71f3ecdc4c12d4b90200e41c9ea658366 Mon Sep 17 00:00:00 2001
|
||||||
From: Ray Strode <rstrode@redhat.com>
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
Date: Fri, 13 Oct 2017 13:56:22 -0400
|
Date: Fri, 13 Oct 2017 13:56:22 -0400
|
||||||
Subject: [PATCH] Revert "data: Add gnome-login.session"
|
Subject: [PATCH] Revert "data: Add gnome-login.session"
|
||||||
|
@ -12,10 +12,13 @@ This reverts commit 1073f0e792d9d5bf9d53bddb6e51177c8024c2b3.
|
||||||
delete mode 100644 data/gnome-login.session.in
|
delete mode 100644 data/gnome-login.session.in
|
||||||
|
|
||||||
diff --git a/data/Makefile.am b/data/Makefile.am
|
diff --git a/data/Makefile.am b/data/Makefile.am
|
||||||
index c10c9151..f2875fcb 100644
|
index a47e7900..f69ec12d 100644
|
||||||
--- a/data/Makefile.am
|
--- a/data/Makefile.am
|
||||||
+++ b/data/Makefile.am
|
+++ b/data/Makefile.am
|
||||||
@@ -59,74 +59,63 @@ schemas_in_files = gdm.schemas.in
|
@@ -56,74 +56,63 @@ gsettings_SCHEMAS = org.gnome.login-screen.gschema.xml
|
||||||
|
|
||||||
|
schemasdir = $(pkgdatadir)
|
||||||
|
schemas_in_files = gdm.schemas.in
|
||||||
schemas_DATA = $(schemas_in_files:.schemas.in=.schemas)
|
schemas_DATA = $(schemas_in_files:.schemas.in=.schemas)
|
||||||
|
|
||||||
gdm.schemas.in: $(srcdir)/gdm.schemas.in.in
|
gdm.schemas.in: $(srcdir)/gdm.schemas.in.in
|
||||||
|
@ -32,9 +35,6 @@ index c10c9151..f2875fcb 100644
|
||||||
-e 's,[@]ALWAYS_RESTART_SERVER[@],$(ALWAYS_RESTART_SERVER),g' \
|
-e 's,[@]ALWAYS_RESTART_SERVER[@],$(ALWAYS_RESTART_SERVER),g' \
|
||||||
-e 's,[@]X_CONFIG_OPTIONS[@],$(X_CONFIG_OPTIONS),g' \
|
-e 's,[@]X_CONFIG_OPTIONS[@],$(X_CONFIG_OPTIONS),g' \
|
||||||
-e 's,[@]X_SERVER[@],$(X_SERVER),g' \
|
-e 's,[@]X_SERVER[@],$(X_SERVER),g' \
|
||||||
-e 's,[@]X_XNEST_CMD[@],$(X_XNEST_CMD),g' \
|
|
||||||
-e 's,[@]X_XNEST_CONFIG_OPTIONS[@],$(X_XNEST_CONFIG_OPTIONS),g' \
|
|
||||||
-e 's,[@]X_XNEST_UNSCALED_FONTPATH[@],$(X_XNEST_UNSCALED_FONTPATH),g' \
|
|
||||||
-e 's,[@]GDM_RBAC_SYSCMD_KEYS[@],$(GDM_RBAC_SYSCMD_KEYS),g' \
|
-e 's,[@]GDM_RBAC_SYSCMD_KEYS[@],$(GDM_RBAC_SYSCMD_KEYS),g' \
|
||||||
-e 's,[@]datadir[@],$(datadir),g' \
|
-e 's,[@]datadir[@],$(datadir),g' \
|
||||||
-e 's,[@]gdmconfdir[@],$(gdmconfdir),g' \
|
-e 's,[@]gdmconfdir[@],$(gdmconfdir),g' \
|
||||||
|
@ -90,14 +90,14 @@ index c10c9151..f2875fcb 100644
|
||||||
pam-lfs/gdm-autologin.pam \
|
pam-lfs/gdm-autologin.pam \
|
||||||
pam-lfs/gdm-launch-environment.pam \
|
pam-lfs/gdm-launch-environment.pam \
|
||||||
pam-lfs/gdm-fingerprint.pam \
|
pam-lfs/gdm-fingerprint.pam \
|
||||||
@@ -163,61 +152,60 @@ endif
|
@@ -164,61 +153,60 @@ udevrules_DATA = 61-gdm.rules
|
||||||
|
|
||||||
EXTRA_DIST += \
|
EXTRA_DIST += \
|
||||||
$(dconf_db_files) \
|
$(dconf_db_files) \
|
||||||
$(schemas_in_files) \
|
$(schemas_in_files) \
|
||||||
$(schemas_DATA) \
|
$(schemas_DATA) \
|
||||||
$(dbusconf_in_files) \
|
$(dbusconf_in_files) \
|
||||||
$(localealias_DATA) \
|
$(localealias_DATA) \
|
||||||
|
$(udevrules_DATA) \
|
||||||
gdm.schemas.in.in \
|
gdm.schemas.in.in \
|
||||||
gdm.conf-custom.in \
|
gdm.conf-custom.in \
|
||||||
Xsession.in \
|
Xsession.in \
|
||||||
|
@ -200,13 +200,13 @@ index 603903e6..f109e0a9 100644
|
||||||
media=''
|
media=''
|
||||||
diff --git a/data/gnome-login.session.in b/data/gnome-login.session.in
|
diff --git a/data/gnome-login.session.in b/data/gnome-login.session.in
|
||||||
deleted file mode 100644
|
deleted file mode 100644
|
||||||
index 764afd15..00000000
|
index fbc10580..00000000
|
||||||
--- a/data/gnome-login.session.in
|
--- a/data/gnome-login.session.in
|
||||||
+++ /dev/null
|
+++ /dev/null
|
||||||
@@ -1,3 +0,0 @@
|
@@ -1,3 +0,0 @@
|
||||||
-[GNOME Session]
|
-[GNOME Session]
|
||||||
-Name=Display Manager
|
-Name=Display Manager
|
||||||
-RequiredComponents=org.gnome.Shell;org.gnome.SettingsDaemon.A11yKeyboard;org.gnome.SettingsDaemon.A11ySettings;org.gnome.SettingsDaemon.Clipboard;org.gnome.SettingsDaemon.Color;org.gnome.SettingsDaemon.Datetime;org.gnome.SettingsDaemon.Housekeeping;org.gnome.SettingsDaemon.Keyboard;org.gnome.SettingsDaemon.MediaKeys;org.gnome.SettingsDaemon.Mouse;org.gnome.SettingsDaemon.Power;org.gnome.SettingsDaemon.PrintNotifications;org.gnome.SettingsDaemon.Rfkill;org.gnome.SettingsDaemon.ScreensaverProxy;org.gnome.SettingsDaemon.Sharing;org.gnome.SettingsDaemon.Smartcard;org.gnome.SettingsDaemon.Sound;org.gnome.SettingsDaemon.Wacom;org.gnome.SettingsDaemon.XSettings;
|
-RequiredComponents=org.gnome.Shell;org.gnome.SettingsDaemon.A11ySettings;org.gnome.SettingsDaemon.Clipboard;org.gnome.SettingsDaemon.Color;org.gnome.SettingsDaemon.Datetime;org.gnome.SettingsDaemon.Housekeeping;org.gnome.SettingsDaemon.Keyboard;org.gnome.SettingsDaemon.MediaKeys;org.gnome.SettingsDaemon.Mouse;org.gnome.SettingsDaemon.Power;org.gnome.SettingsDaemon.PrintNotifications;org.gnome.SettingsDaemon.Rfkill;org.gnome.SettingsDaemon.ScreensaverProxy;org.gnome.SettingsDaemon.Sharing;org.gnome.SettingsDaemon.Smartcard;org.gnome.SettingsDaemon.Sound;org.gnome.SettingsDaemon.Wacom;org.gnome.SettingsDaemon.XSettings;
|
||||||
--
|
--
|
||||||
2.14.2
|
1.8.3.1
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,136 @@
|
||||||
|
From 086d68f24d984fb48e44aa16aa815825cd5ed0bc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jason Pleau <jason@jpleau.ca>
|
||||||
|
Date: Wed, 30 May 2018 21:48:22 -0400
|
||||||
|
Subject: [PATCH] daemon/gdm-session-record.c: open/close the utmp database
|
||||||
|
|
||||||
|
pututxline() was used without first opening the utxmp database and
|
||||||
|
without closing it, preventing the logout entry from being fully
|
||||||
|
committed.
|
||||||
|
|
||||||
|
This caused the number of logged-in users to increment after each login,
|
||||||
|
as logging out did not correctly remove the user login record from utmp.
|
||||||
|
|
||||||
|
This commit wraps pututxline() between setutxent() and endutxent(),
|
||||||
|
making sure that the login/logout operation are fully flushed.
|
||||||
|
|
||||||
|
Fixes #381
|
||||||
|
---
|
||||||
|
daemon/gdm-session-record.c | 4 ++++
|
||||||
|
1 file changed, 4 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/daemon/gdm-session-record.c b/daemon/gdm-session-record.c
|
||||||
|
index 487f10047..d2df58873 100644
|
||||||
|
--- a/daemon/gdm-session-record.c
|
||||||
|
+++ b/daemon/gdm-session-record.c
|
||||||
|
@@ -186,104 +186,108 @@ gdm_session_record_login (GPid session_pid,
|
||||||
|
|
||||||
|
g_debug ("Writing login record");
|
||||||
|
|
||||||
|
#if defined(HAVE_UT_UT_TYPE)
|
||||||
|
session_record.ut_type = USER_PROCESS;
|
||||||
|
g_debug ("using ut_type USER_PROCESS");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
record_set_timestamp (&session_record);
|
||||||
|
record_set_pid (&session_record, session_pid);
|
||||||
|
record_set_host (&session_record, x11_display_name, host_name);
|
||||||
|
record_set_line (&session_record, display_device, x11_display_name);
|
||||||
|
|
||||||
|
/* Handle wtmp */
|
||||||
|
g_debug ("Writing wtmp session record to " GDM_NEW_SESSION_RECORDS_FILE);
|
||||||
|
#if defined(HAVE_UPDWTMPX)
|
||||||
|
updwtmpx (GDM_NEW_SESSION_RECORDS_FILE, &session_record);
|
||||||
|
#elif defined(HAVE_UPDWTMP)
|
||||||
|
updwtmp (GDM_NEW_SESSION_RECORDS_FILE, &session_record);
|
||||||
|
#elif defined(HAVE_LOGWTMP) && defined(HAVE_UT_UT_HOST)
|
||||||
|
#if defined(HAVE_UT_UT_USER)
|
||||||
|
logwtmp (session_record.ut_line, session_record.ut_user, session_record.ut_host);
|
||||||
|
#elif defined(HAVE_UT_UT_NAME)
|
||||||
|
logwtmp (session_record.ut_line, session_record.ut_name, session_record.ut_host);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Handle utmp */
|
||||||
|
#if defined(HAVE_GETUTXENT)
|
||||||
|
g_debug ("Adding or updating utmp record for login");
|
||||||
|
+ setutxent();
|
||||||
|
pututxline (&session_record);
|
||||||
|
+ endutxent();
|
||||||
|
#elif defined(HAVE_LOGIN)
|
||||||
|
login (&session_record);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gdm_session_record_logout (GPid session_pid,
|
||||||
|
const char *user_name,
|
||||||
|
const char *host_name,
|
||||||
|
const char *x11_display_name,
|
||||||
|
const char *display_device)
|
||||||
|
{
|
||||||
|
UTMP session_record = { 0 };
|
||||||
|
|
||||||
|
if (x11_display_name == NULL)
|
||||||
|
x11_display_name = display_device;
|
||||||
|
|
||||||
|
g_debug ("Writing logout record");
|
||||||
|
|
||||||
|
#if defined(HAVE_UT_UT_TYPE)
|
||||||
|
session_record.ut_type = DEAD_PROCESS;
|
||||||
|
g_debug ("using ut_type DEAD_PROCESS");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
record_set_timestamp (&session_record);
|
||||||
|
record_set_pid (&session_record, session_pid);
|
||||||
|
record_set_host (&session_record, x11_display_name, host_name);
|
||||||
|
record_set_line (&session_record, display_device, x11_display_name);
|
||||||
|
|
||||||
|
/* Handle wtmp */
|
||||||
|
g_debug ("Writing wtmp logout record to " GDM_NEW_SESSION_RECORDS_FILE);
|
||||||
|
#if defined(HAVE_UPDWTMPX)
|
||||||
|
updwtmpx (GDM_NEW_SESSION_RECORDS_FILE, &session_record);
|
||||||
|
#elif defined (HAVE_UPDWTMP)
|
||||||
|
updwtmp (GDM_NEW_SESSION_RECORDS_FILE, &session_record);
|
||||||
|
#elif defined(HAVE_LOGWTMP)
|
||||||
|
logwtmp (session_record.ut_line, "", "");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Handle utmp */
|
||||||
|
#if defined(HAVE_GETUTXENT)
|
||||||
|
g_debug ("Adding or updating utmp record for logout");
|
||||||
|
+ setutxent();
|
||||||
|
pututxline (&session_record);
|
||||||
|
+ endutxent();
|
||||||
|
#elif defined(HAVE_LOGOUT)
|
||||||
|
logout (session_record.ut_line);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gdm_session_record_failed (GPid session_pid,
|
||||||
|
const char *user_name,
|
||||||
|
const char *host_name,
|
||||||
|
const char *x11_display_name,
|
||||||
|
const char *display_device)
|
||||||
|
{
|
||||||
|
UTMP session_record = { 0 };
|
||||||
|
|
||||||
|
if (x11_display_name == NULL)
|
||||||
|
x11_display_name = display_device;
|
||||||
|
|
||||||
|
record_set_username (&session_record, user_name);
|
||||||
|
|
||||||
|
g_debug ("Writing failed session attempt record");
|
||||||
|
|
||||||
|
#if defined(HAVE_UT_UT_TYPE)
|
||||||
|
session_record.ut_type = USER_PROCESS;
|
||||||
|
g_debug ("using ut_type USER_PROCESS");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
record_set_timestamp (&session_record);
|
||||||
|
record_set_pid (&session_record, session_pid);
|
||||||
|
record_set_host (&session_record, x11_display_name, host_name);
|
||||||
|
record_set_line (&session_record, display_device, x11_display_name);
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
From a9b82ca4a87315235924317c0fc48324a8b7cb9f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Mon, 21 May 2018 11:13:31 -0400
|
||||||
|
Subject: [PATCH] data: change cirrus blacklist to use gdm-disable-wayland
|
||||||
|
|
||||||
|
Now that we have a gdm-disable-wayland binary for disabling
|
||||||
|
wayland at boot, we should use it.
|
||||||
|
|
||||||
|
This commit changes the cirrus udev rule to use gdm-disable-wayland,
|
||||||
|
rather than running sh and printf.
|
||||||
|
|
||||||
|
https://bugzilla.gnome.org/show_bug.cgi?id=796315
|
||||||
|
|
||||||
|
|
||||||
|
(cherry picked from commit a913eea70342411247e770a91b75dd800941bb6e)
|
||||||
|
---
|
||||||
|
data/61-gdm.rules | 2 --
|
||||||
|
data/61-gdm.rules.in | 2 ++
|
||||||
|
data/Makefile.am | 5 +++++
|
||||||
|
3 files changed, 7 insertions(+), 2 deletions(-)
|
||||||
|
delete mode 100644 data/61-gdm.rules
|
||||||
|
create mode 100644 data/61-gdm.rules.in
|
||||||
|
|
||||||
|
diff --git a/data/61-gdm.rules b/data/61-gdm.rules
|
||||||
|
deleted file mode 100644
|
||||||
|
index 5ffa8b8a0..000000000
|
||||||
|
--- a/data/61-gdm.rules
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,2 +0,0 @@
|
||||||
|
-# disable Wayland on Cirrus chipsets
|
||||||
|
-ATTR{vendor}=="0x1013", ATTR{device}=="0x00b8", ATTR{subsystem_vendor}=="0x1af4", ATTR{subsystem_device}=="0x1100", RUN+="/bin/sh -c '/bin/mkdir /run/gdm ; /usr/bin/printf \"[daemon]\nWaylandEnable=false\" >> /run/gdm/custom.conf'"
|
||||||
|
diff --git a/data/61-gdm.rules.in b/data/61-gdm.rules.in
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..de8e17903
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/data/61-gdm.rules.in
|
||||||
|
@@ -0,0 +1,2 @@
|
||||||
|
+# disable Wayland on Cirrus chipsets
|
||||||
|
+ATTR{vendor}=="0x1013", ATTR{device}=="0x00b8", ATTR{subsystem_vendor}=="0x1af4", ATTR{subsystem_device}=="0x1100", RUN+="@libexecdir@/gdm-disable-wayland"
|
||||||
|
diff --git a/data/Makefile.am b/data/Makefile.am
|
||||||
|
index a47e7900f..192dfa052 100644
|
||||||
|
--- a/data/Makefile.am
|
||||||
|
+++ b/data/Makefile.am
|
||||||
|
@@ -134,60 +134,65 @@ pam_lfs_files = \
|
||||||
|
EXTRA_DIST += $(pam_lfs_files)
|
||||||
|
|
||||||
|
pam_arch_files = pam-arch/gdm-autologin.pam \
|
||||||
|
pam-arch/gdm-launch-environment.pam \
|
||||||
|
pam-arch/gdm-fingerprint.pam \
|
||||||
|
pam-arch/gdm-smartcard.pam \
|
||||||
|
pam-arch/gdm-password.pam \
|
||||||
|
pam-arch/gdm-pin.pam \
|
||||||
|
$(NULL)
|
||||||
|
EXTRA_DIST += $(pam_arch_files)
|
||||||
|
|
||||||
|
if ENABLE_REDHAT_PAM_CONFIG
|
||||||
|
pam_files = $(pam_redhat_files)
|
||||||
|
endif
|
||||||
|
if ENABLE_OPENEMBEDDED_PAM_CONFIG
|
||||||
|
pam_files = $(pam_openembedded_files)
|
||||||
|
endif
|
||||||
|
if ENABLE_EXHERBO_PAM_CONFIG
|
||||||
|
pam_files = $(pam_exherbo_files)
|
||||||
|
endif
|
||||||
|
if ENABLE_LFS_PAM_CONFIG
|
||||||
|
pam_files = $(pam_lfs_files)
|
||||||
|
endif
|
||||||
|
if ENABLE_ARCH_PAM_CONFIG
|
||||||
|
pam_files = $(pam_arch_files)
|
||||||
|
endif
|
||||||
|
|
||||||
|
udevrulesdir = $(prefix)/lib/udev/rules.d
|
||||||
|
udevrules_DATA = 61-gdm.rules
|
||||||
|
|
||||||
|
+EXTRA_DIST += $(srcdir)/61-gdm.rules.in
|
||||||
|
+61-gdm.rules: $(srcdir)/61-gdm.rules.in
|
||||||
|
+ sed -e 's,[@]libexecdir[@],$(libexecdir),g' \
|
||||||
|
+ < $< > $@.tmp && mv $@.tmp $@
|
||||||
|
+
|
||||||
|
EXTRA_DIST += \
|
||||||
|
$(dconf_db_files) \
|
||||||
|
$(schemas_in_files) \
|
||||||
|
$(schemas_DATA) \
|
||||||
|
$(dbusconf_in_files) \
|
||||||
|
$(localealias_DATA) \
|
||||||
|
$(udevrules_DATA) \
|
||||||
|
gdm.schemas.in.in \
|
||||||
|
gdm.conf-custom.in \
|
||||||
|
Xsession.in \
|
||||||
|
Init.in \
|
||||||
|
PreSession.in \
|
||||||
|
PostSession.in \
|
||||||
|
PostLogin \
|
||||||
|
org.gnome.login-screen.gschema.xml.in \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
CLEANFILES = \
|
||||||
|
Xsession \
|
||||||
|
gdm.conf-custom \
|
||||||
|
Init \
|
||||||
|
PreSession \
|
||||||
|
PostSession \
|
||||||
|
$(gsettings_SCHEMAS) \
|
||||||
|
greeter-dconf-defaults \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
DISTCLEANFILES = \
|
||||||
|
$(dbusconf_DATA) \
|
||||||
|
gdm.schemas \
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
From 82006d15b70842d2b1ad7d47d9490e315436cb5f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Fri, 22 Jun 2018 14:44:11 -0400
|
||||||
|
Subject: [PATCH 1/6] manager: plug leak in maybe_activate_other_session
|
||||||
|
|
||||||
|
The function asks logind what the currently active session is on the
|
||||||
|
given seat. It then leaks the response.
|
||||||
|
|
||||||
|
This commit plugs the leak.
|
||||||
|
---
|
||||||
|
daemon/gdm-manager.c | 4 +++-
|
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
|
||||||
|
index 7539acf11..129cc0de4 100644
|
||||||
|
--- a/daemon/gdm-manager.c
|
||||||
|
+++ b/daemon/gdm-manager.c
|
||||||
|
@@ -1394,79 +1394,81 @@ get_login_window_session_id (const char *seat_id,
|
||||||
|
out:
|
||||||
|
if (sessions) {
|
||||||
|
for (i = 0; sessions[i]; i ++) {
|
||||||
|
free (sessions[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
free (sessions);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
activate_login_window_session_on_seat (GdmManager *self,
|
||||||
|
const char *seat_id)
|
||||||
|
{
|
||||||
|
char *session_id;
|
||||||
|
|
||||||
|
if (!get_login_window_session_id (seat_id, &session_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
activate_session_id (self, seat_id, session_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
maybe_activate_other_session (GdmManager *self,
|
||||||
|
GdmDisplay *old_display)
|
||||||
|
{
|
||||||
|
char *seat_id = NULL;
|
||||||
|
- char *session_id;
|
||||||
|
+ char *session_id = NULL;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
g_object_get (G_OBJECT (old_display),
|
||||||
|
"seat-id", &seat_id,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
ret = sd_seat_get_active (seat_id, &session_id, NULL);
|
||||||
|
|
||||||
|
if (ret == 0) {
|
||||||
|
GdmDisplay *display;
|
||||||
|
|
||||||
|
display = gdm_display_store_find (self->priv->display_store,
|
||||||
|
lookup_by_session_id,
|
||||||
|
(gpointer) session_id);
|
||||||
|
|
||||||
|
if (display == NULL) {
|
||||||
|
activate_login_window_session_on_seat (self, seat_id);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ g_free (session_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (seat_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
get_username_for_greeter_display (GdmManager *manager,
|
||||||
|
GdmDisplay *display)
|
||||||
|
{
|
||||||
|
gboolean doing_initial_setup = FALSE;
|
||||||
|
|
||||||
|
g_object_get (G_OBJECT (display),
|
||||||
|
"doing-initial-setup", &doing_initial_setup,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (doing_initial_setup) {
|
||||||
|
return INITIAL_SETUP_USERNAME;
|
||||||
|
} else {
|
||||||
|
return GDM_USERNAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_up_automatic_login_session (GdmManager *manager,
|
||||||
|
GdmDisplay *display)
|
||||||
|
{
|
||||||
|
GdmSession *session;
|
||||||
|
char *display_session_type = NULL;
|
||||||
|
gboolean is_initial;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.19.0
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
From 6b4402fb0bbf17803c2354e92fc448a537d2d506 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Fri, 22 Jun 2018 14:55:39 -0400
|
||||||
|
Subject: [PATCH 2/6] manager: start login screen if old one is finished
|
||||||
|
|
||||||
|
Since commit 22c332ba we try to start a login screen if we end up
|
||||||
|
on an empty VT and there isn't one running.
|
||||||
|
|
||||||
|
Unfortunately the check for "is on an empty VT" is a little busted.
|
||||||
|
It counts the VT has non-empty if there's a display associated with
|
||||||
|
it, even if that display is in the FINISHED state about to be
|
||||||
|
reaped.
|
||||||
|
|
||||||
|
That means, in some cases, we'll still leave the user on an empty
|
||||||
|
VT with no login screen.
|
||||||
|
|
||||||
|
This commit addresses the problem by explicitly checking for
|
||||||
|
FINISHED displays, and proceeding even in their presense.
|
||||||
|
---
|
||||||
|
daemon/gdm-manager.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
|
||||||
|
index 129cc0de4..3f5772e65 100644
|
||||||
|
--- a/daemon/gdm-manager.c
|
||||||
|
+++ b/daemon/gdm-manager.c
|
||||||
|
@@ -1410,61 +1410,61 @@ activate_login_window_session_on_seat (GdmManager *self,
|
||||||
|
char *session_id;
|
||||||
|
|
||||||
|
if (!get_login_window_session_id (seat_id, &session_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
activate_session_id (self, seat_id, session_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
maybe_activate_other_session (GdmManager *self,
|
||||||
|
GdmDisplay *old_display)
|
||||||
|
{
|
||||||
|
char *seat_id = NULL;
|
||||||
|
char *session_id = NULL;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
g_object_get (G_OBJECT (old_display),
|
||||||
|
"seat-id", &seat_id,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
ret = sd_seat_get_active (seat_id, &session_id, NULL);
|
||||||
|
|
||||||
|
if (ret == 0) {
|
||||||
|
GdmDisplay *display;
|
||||||
|
|
||||||
|
display = gdm_display_store_find (self->priv->display_store,
|
||||||
|
lookup_by_session_id,
|
||||||
|
(gpointer) session_id);
|
||||||
|
|
||||||
|
- if (display == NULL) {
|
||||||
|
+ if (display == NULL || gdm_display_get_status (display) == GDM_DISPLAY_FINISHED) {
|
||||||
|
activate_login_window_session_on_seat (self, seat_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (session_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (seat_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
get_username_for_greeter_display (GdmManager *manager,
|
||||||
|
GdmDisplay *display)
|
||||||
|
{
|
||||||
|
gboolean doing_initial_setup = FALSE;
|
||||||
|
|
||||||
|
g_object_get (G_OBJECT (display),
|
||||||
|
"doing-initial-setup", &doing_initial_setup,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (doing_initial_setup) {
|
||||||
|
return INITIAL_SETUP_USERNAME;
|
||||||
|
} else {
|
||||||
|
return GDM_USERNAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_up_automatic_login_session (GdmManager *manager,
|
||||||
|
GdmDisplay *display)
|
||||||
|
{
|
||||||
|
--
|
||||||
|
2.19.0
|
||||||
|
|
|
@ -0,0 +1,126 @@
|
||||||
|
From 64779fcad9efa9fdb4b1a8963e2386cf763e53d8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Fri, 22 Jun 2018 15:26:03 -0400
|
||||||
|
Subject: [PATCH 3/6] manager: don't bail if session disappears out from under
|
||||||
|
us
|
||||||
|
|
||||||
|
It's entirely possible for a session returned by
|
||||||
|
sd_seat_get_sessions to disappear immediately after the
|
||||||
|
sd_seat_get_sessions call returns. This is especially
|
||||||
|
likely at logout time where the session will briefly be
|
||||||
|
in the "closing" state before getting reaped.
|
||||||
|
|
||||||
|
If that happens when we're looking for a greeter session, we
|
||||||
|
stop looking for a greeter session and bail out all confused.
|
||||||
|
|
||||||
|
This commit fixes the confusion by gracefully handling the
|
||||||
|
session disappearing by just proceeding to the next session
|
||||||
|
in the list.
|
||||||
|
---
|
||||||
|
daemon/gdm-manager.c | 9 +++++++++
|
||||||
|
1 file changed, 9 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
|
||||||
|
index 3f5772e65..c391307fa 100644
|
||||||
|
--- a/daemon/gdm-manager.c
|
||||||
|
+++ b/daemon/gdm-manager.c
|
||||||
|
@@ -1318,87 +1318,96 @@ maybe_start_pending_initial_login (GdmManager *manager,
|
||||||
|
g_free (user_session_seat_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
get_login_window_session_id (const char *seat_id,
|
||||||
|
char **session_id)
|
||||||
|
{
|
||||||
|
gboolean ret;
|
||||||
|
int res, i;
|
||||||
|
char **sessions;
|
||||||
|
char *service_id;
|
||||||
|
char *service_class;
|
||||||
|
char *state;
|
||||||
|
|
||||||
|
res = sd_seat_get_sessions (seat_id, &sessions, NULL, NULL);
|
||||||
|
if (res < 0) {
|
||||||
|
g_debug ("Failed to determine sessions: %s", strerror (-res));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sessions == NULL || sessions[0] == NULL) {
|
||||||
|
*session_id = NULL;
|
||||||
|
ret = TRUE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; sessions[i]; i ++) {
|
||||||
|
|
||||||
|
res = sd_session_get_class (sessions[i], &service_class);
|
||||||
|
if (res < 0) {
|
||||||
|
+ if (res == -ENOENT || res == -ENXIO) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
g_debug ("failed to determine class of session %s: %s", sessions[i], strerror (-res));
|
||||||
|
ret = FALSE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp (service_class, "greeter") != 0) {
|
||||||
|
free (service_class);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
free (service_class);
|
||||||
|
|
||||||
|
ret = sd_session_get_state (sessions[i], &state);
|
||||||
|
if (ret < 0) {
|
||||||
|
+ if (res == -ENOENT || res == -ENXIO)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
g_debug ("failed to determine state of session %s: %s", sessions[i], strerror (-res));
|
||||||
|
ret = FALSE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_strcmp0 (state, "closing") == 0) {
|
||||||
|
free (state);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
free (state);
|
||||||
|
|
||||||
|
res = sd_session_get_service (sessions[i], &service_id);
|
||||||
|
if (res < 0) {
|
||||||
|
+ if (res == -ENOENT || res == -ENXIO)
|
||||||
|
+ continue;
|
||||||
|
g_debug ("failed to determine service of session %s: %s", sessions[i], strerror (-res));
|
||||||
|
ret = FALSE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp (service_id, "gdm-launch-environment") == 0) {
|
||||||
|
*session_id = g_strdup (sessions[i]);
|
||||||
|
ret = TRUE;
|
||||||
|
|
||||||
|
free (service_id);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
free (service_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
*session_id = NULL;
|
||||||
|
ret = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (sessions) {
|
||||||
|
for (i = 0; sessions[i]; i ++) {
|
||||||
|
free (sessions[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
free (sessions);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.19.0
|
||||||
|
|
|
@ -0,0 +1,146 @@
|
||||||
|
From 65c3fc674ee4ec0f5139973aa53114db2f1fcf45 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Tue, 17 Jul 2018 15:40:25 -0400
|
||||||
|
Subject: [PATCH 4/6] manager: make get_login_window_session_id fail if no
|
||||||
|
login screen
|
||||||
|
|
||||||
|
Right now we oddly succeed from get_login_window_session_id
|
||||||
|
if we can't find a login window.
|
||||||
|
|
||||||
|
None of the caller expect that, so fail instead.
|
||||||
|
---
|
||||||
|
daemon/gdm-manager.c | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
|
||||||
|
index c391307fa..34ee74033 100644
|
||||||
|
--- a/daemon/gdm-manager.c
|
||||||
|
+++ b/daemon/gdm-manager.c
|
||||||
|
@@ -1310,122 +1310,122 @@ maybe_start_pending_initial_login (GdmManager *manager,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (g_strcmp0 (greeter_seat_id, user_session_seat_id) == 0) {
|
||||||
|
start_user_session (manager, operation);
|
||||||
|
manager->priv->initial_login_operation = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (greeter_seat_id);
|
||||||
|
g_free (user_session_seat_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
get_login_window_session_id (const char *seat_id,
|
||||||
|
char **session_id)
|
||||||
|
{
|
||||||
|
gboolean ret;
|
||||||
|
int res, i;
|
||||||
|
char **sessions;
|
||||||
|
char *service_id;
|
||||||
|
char *service_class;
|
||||||
|
char *state;
|
||||||
|
|
||||||
|
res = sd_seat_get_sessions (seat_id, &sessions, NULL, NULL);
|
||||||
|
if (res < 0) {
|
||||||
|
g_debug ("Failed to determine sessions: %s", strerror (-res));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sessions == NULL || sessions[0] == NULL) {
|
||||||
|
*session_id = NULL;
|
||||||
|
- ret = TRUE;
|
||||||
|
+ ret = FALSE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; sessions[i]; i ++) {
|
||||||
|
|
||||||
|
res = sd_session_get_class (sessions[i], &service_class);
|
||||||
|
if (res < 0) {
|
||||||
|
if (res == -ENOENT || res == -ENXIO) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_debug ("failed to determine class of session %s: %s", sessions[i], strerror (-res));
|
||||||
|
ret = FALSE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp (service_class, "greeter") != 0) {
|
||||||
|
free (service_class);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
free (service_class);
|
||||||
|
|
||||||
|
ret = sd_session_get_state (sessions[i], &state);
|
||||||
|
if (ret < 0) {
|
||||||
|
if (res == -ENOENT || res == -ENXIO)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
g_debug ("failed to determine state of session %s: %s", sessions[i], strerror (-res));
|
||||||
|
ret = FALSE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_strcmp0 (state, "closing") == 0) {
|
||||||
|
free (state);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
free (state);
|
||||||
|
|
||||||
|
res = sd_session_get_service (sessions[i], &service_id);
|
||||||
|
if (res < 0) {
|
||||||
|
if (res == -ENOENT || res == -ENXIO)
|
||||||
|
continue;
|
||||||
|
g_debug ("failed to determine service of session %s: %s", sessions[i], strerror (-res));
|
||||||
|
ret = FALSE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp (service_id, "gdm-launch-environment") == 0) {
|
||||||
|
*session_id = g_strdup (sessions[i]);
|
||||||
|
ret = TRUE;
|
||||||
|
|
||||||
|
free (service_id);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
free (service_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
*session_id = NULL;
|
||||||
|
- ret = TRUE;
|
||||||
|
+ ret = FALSE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (sessions) {
|
||||||
|
for (i = 0; sessions[i]; i ++) {
|
||||||
|
free (sessions[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
free (sessions);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
activate_login_window_session_on_seat (GdmManager *self,
|
||||||
|
const char *seat_id)
|
||||||
|
{
|
||||||
|
char *session_id;
|
||||||
|
|
||||||
|
if (!get_login_window_session_id (seat_id, &session_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
activate_session_id (self, seat_id, session_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
maybe_activate_other_session (GdmManager *self,
|
||||||
|
GdmDisplay *old_display)
|
||||||
|
{
|
||||||
|
--
|
||||||
|
2.19.0
|
||||||
|
|
|
@ -0,0 +1,654 @@
|
||||||
|
From b7b492296a69bc5100ff5908048ed5ef121d3587 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Mon, 30 Jul 2018 16:21:29 -0400
|
||||||
|
Subject: [PATCH 5/6] daemon: try harder to get to a login screen at logout
|
||||||
|
|
||||||
|
commit 22c332ba and some follow up commits try to ensure the
|
||||||
|
user never stays on a blank VT by jumping to a login screen in
|
||||||
|
the event they'd end up on one.
|
||||||
|
|
||||||
|
Unfortunately, that part of the code can't start a login screen
|
||||||
|
if there's not one running at all.
|
||||||
|
|
||||||
|
This commit moves the code to GdmLocalDisplyFactor where the
|
||||||
|
login screens are created, so users won't end up on a blank
|
||||||
|
VT even if no login screen is yet running.
|
||||||
|
---
|
||||||
|
daemon/gdm-local-display-factory.c | 161 ++++++++++++++++++++++++++++-
|
||||||
|
daemon/gdm-manager.c | 54 ----------
|
||||||
|
2 files changed, 156 insertions(+), 59 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
|
||||||
|
index b29f5ac52..cf852b55a 100644
|
||||||
|
--- a/daemon/gdm-local-display-factory.c
|
||||||
|
+++ b/daemon/gdm-local-display-factory.c
|
||||||
|
@@ -1,60 +1,62 @@
|
||||||
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
#include <glib/gi18n.h>
|
||||||
|
#include <glib-object.h>
|
||||||
|
#include <gio/gio.h>
|
||||||
|
|
||||||
|
+#include <systemd/sd-login.h>
|
||||||
|
+
|
||||||
|
#include "gdm-common.h"
|
||||||
|
#include "gdm-manager.h"
|
||||||
|
#include "gdm-display-factory.h"
|
||||||
|
#include "gdm-local-display-factory.h"
|
||||||
|
#include "gdm-local-display-factory-glue.h"
|
||||||
|
|
||||||
|
#include "gdm-settings-keys.h"
|
||||||
|
#include "gdm-settings-direct.h"
|
||||||
|
#include "gdm-display-store.h"
|
||||||
|
#include "gdm-local-display.h"
|
||||||
|
#include "gdm-legacy-display.h"
|
||||||
|
|
||||||
|
#define GDM_LOCAL_DISPLAY_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LOCAL_DISPLAY_FACTORY, GdmLocalDisplayFactoryPrivate))
|
||||||
|
|
||||||
|
#define GDM_DBUS_PATH "/org/gnome/DisplayManager"
|
||||||
|
#define GDM_LOCAL_DISPLAY_FACTORY_DBUS_PATH GDM_DBUS_PATH "/LocalDisplayFactory"
|
||||||
|
#define GDM_MANAGER_DBUS_NAME "org.gnome.DisplayManager.LocalDisplayFactory"
|
||||||
|
|
||||||
|
#define MAX_DISPLAY_FAILURES 5
|
||||||
|
|
||||||
|
struct GdmLocalDisplayFactoryPrivate
|
||||||
|
{
|
||||||
|
GdmDBusLocalDisplayFactory *skeleton;
|
||||||
|
GDBusConnection *connection;
|
||||||
|
GHashTable *used_display_numbers;
|
||||||
|
|
||||||
|
/* FIXME: this needs to be per seat? */
|
||||||
|
guint num_failures;
|
||||||
|
|
||||||
|
guint seat_new_id;
|
||||||
|
@@ -226,171 +228,320 @@ gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *fact
|
||||||
|
store_display (factory, display);
|
||||||
|
|
||||||
|
if (! gdm_display_manage (display)) {
|
||||||
|
display = NULL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! gdm_display_get_id (display, id, NULL)) {
|
||||||
|
display = NULL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = TRUE;
|
||||||
|
out:
|
||||||
|
/* ref either held by store or not at all */
|
||||||
|
g_object_unref (display);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_display_status_changed (GdmDisplay *display,
|
||||||
|
GParamSpec *arg1,
|
||||||
|
GdmLocalDisplayFactory *factory)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
GdmDisplayStore *store;
|
||||||
|
int num;
|
||||||
|
char *seat_id = NULL;
|
||||||
|
char *session_type = NULL;
|
||||||
|
+ char *session_class = NULL;
|
||||||
|
gboolean is_initial = TRUE;
|
||||||
|
gboolean is_local = TRUE;
|
||||||
|
|
||||||
|
num = -1;
|
||||||
|
gdm_display_get_x11_display_number (display, &num, NULL);
|
||||||
|
|
||||||
|
store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
|
||||||
|
|
||||||
|
g_object_get (display,
|
||||||
|
"seat-id", &seat_id,
|
||||||
|
"is-initial", &is_initial,
|
||||||
|
"is-local", &is_local,
|
||||||
|
"session-type", &session_type,
|
||||||
|
+ "session-class", &session_class,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
status = gdm_display_get_status (display);
|
||||||
|
|
||||||
|
g_debug ("GdmLocalDisplayFactory: display status changed: %d", status);
|
||||||
|
switch (status) {
|
||||||
|
case GDM_DISPLAY_FINISHED:
|
||||||
|
/* remove the display number from factory->priv->used_display_numbers
|
||||||
|
so that it may be reused */
|
||||||
|
if (num != -1) {
|
||||||
|
g_hash_table_remove (factory->priv->used_display_numbers, GUINT_TO_POINTER (num));
|
||||||
|
}
|
||||||
|
gdm_display_store_remove (store, display);
|
||||||
|
|
||||||
|
/* if this is a local display, do a full resync. Only
|
||||||
|
* seats without displays will get created anyway. This
|
||||||
|
* ensures we get a new login screen when the user logs out,
|
||||||
|
* if there isn't one.
|
||||||
|
*/
|
||||||
|
- if (is_local) {
|
||||||
|
+ if (is_local && g_strcmp0 (session_class, "greeter") != 0) {
|
||||||
|
/* reset num failures */
|
||||||
|
factory->priv->num_failures = 0;
|
||||||
|
|
||||||
|
gdm_local_display_factory_sync_seats (factory);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GDM_DISPLAY_FAILED:
|
||||||
|
/* leave the display number in factory->priv->used_display_numbers
|
||||||
|
so that it doesn't get reused */
|
||||||
|
gdm_display_store_remove (store, display);
|
||||||
|
|
||||||
|
/* Create a new equivalent display if it was static */
|
||||||
|
if (is_local) {
|
||||||
|
|
||||||
|
factory->priv->num_failures++;
|
||||||
|
|
||||||
|
if (factory->priv->num_failures > MAX_DISPLAY_FAILURES) {
|
||||||
|
/* oh shit */
|
||||||
|
g_warning ("GdmLocalDisplayFactory: maximum number of X display failures reached: check X server log for errors");
|
||||||
|
} else {
|
||||||
|
#ifdef ENABLE_WAYLAND_SUPPORT
|
||||||
|
if (g_strcmp0 (session_type, "wayland") == 0) {
|
||||||
|
g_free (session_type);
|
||||||
|
session_type = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
create_display (factory, seat_id, session_type, is_initial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GDM_DISPLAY_UNMANAGED:
|
||||||
|
break;
|
||||||
|
case GDM_DISPLAY_PREPARED:
|
||||||
|
break;
|
||||||
|
case GDM_DISPLAY_MANAGED:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (seat_id);
|
||||||
|
g_free (session_type);
|
||||||
|
+ g_free (session_class);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
lookup_by_seat_id (const char *id,
|
||||||
|
GdmDisplay *display,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
const char *looking_for = user_data;
|
||||||
|
char *current;
|
||||||
|
gboolean res;
|
||||||
|
|
||||||
|
g_object_get (G_OBJECT (display), "seat-id", ¤t, NULL);
|
||||||
|
|
||||||
|
res = g_strcmp0 (current, looking_for) == 0;
|
||||||
|
|
||||||
|
g_free(current);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static gboolean
|
||||||
|
+activate_session_id (GdmLocalDisplayFactory *self,
|
||||||
|
+ const char *seat_id,
|
||||||
|
+ const char *session_id)
|
||||||
|
+{
|
||||||
|
+ GError *error = NULL;
|
||||||
|
+ GVariant *reply;
|
||||||
|
+
|
||||||
|
+ reply = g_dbus_connection_call_sync (self->priv->connection,
|
||||||
|
+ "org.freedesktop.login1",
|
||||||
|
+ "/org/freedesktop/login1",
|
||||||
|
+ "org.freedesktop.login1.Manager",
|
||||||
|
+ "ActivateSessionOnSeat",
|
||||||
|
+ g_variant_new ("(ss)", session_id, seat_id),
|
||||||
|
+ NULL, /* expected reply */
|
||||||
|
+ G_DBUS_CALL_FLAGS_NONE,
|
||||||
|
+ -1,
|
||||||
|
+ NULL,
|
||||||
|
+ &error);
|
||||||
|
+ if (reply == NULL) {
|
||||||
|
+ g_debug ("GdmManager: logind 'ActivateSessionOnSeat' %s raised:\n %s\n\n",
|
||||||
|
+ g_dbus_error_get_remote_error (error), error->message);
|
||||||
|
+ g_error_free (error);
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ g_variant_unref (reply);
|
||||||
|
+
|
||||||
|
+ return TRUE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static gboolean
|
||||||
|
+get_login_window_session_id (const char *seat_id,
|
||||||
|
+ char **session_id)
|
||||||
|
+{
|
||||||
|
+ gboolean ret;
|
||||||
|
+ int res, i;
|
||||||
|
+ char **sessions;
|
||||||
|
+ char *service_id;
|
||||||
|
+ char *service_class;
|
||||||
|
+ char *state;
|
||||||
|
+
|
||||||
|
+ res = sd_seat_get_sessions (seat_id, &sessions, NULL, NULL);
|
||||||
|
+ if (res < 0) {
|
||||||
|
+ g_debug ("Failed to determine sessions: %s", strerror (-res));
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (sessions == NULL || sessions[0] == NULL) {
|
||||||
|
+ *session_id = NULL;
|
||||||
|
+ ret = TRUE;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (i = 0; sessions[i]; i ++) {
|
||||||
|
+
|
||||||
|
+ res = sd_session_get_class (sessions[i], &service_class);
|
||||||
|
+ if (res < 0) {
|
||||||
|
+ if (res == -ENOENT || res == -ENXIO) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ g_debug ("failed to determine class of session %s: %s", sessions[i], strerror (-res));
|
||||||
|
+ ret = FALSE;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (strcmp (service_class, "greeter") != 0) {
|
||||||
|
+ free (service_class);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ free (service_class);
|
||||||
|
+
|
||||||
|
+ ret = sd_session_get_state (sessions[i], &state);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ if (res == -ENOENT || res == -ENXIO)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ g_debug ("failed to determine state of session %s: %s", sessions[i], strerror (-res));
|
||||||
|
+ ret = FALSE;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (g_strcmp0 (state, "closing") == 0) {
|
||||||
|
+ free (state);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ free (state);
|
||||||
|
+
|
||||||
|
+ res = sd_session_get_service (sessions[i], &service_id);
|
||||||
|
+ if (res < 0) {
|
||||||
|
+ if (res == -ENOENT || res == -ENXIO)
|
||||||
|
+ continue;
|
||||||
|
+ g_debug ("failed to determine service of session %s: %s", sessions[i], strerror (-res));
|
||||||
|
+ ret = FALSE;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (strcmp (service_id, "gdm-launch-environment") == 0) {
|
||||||
|
+ *session_id = g_strdup (sessions[i]);
|
||||||
|
+ ret = TRUE;
|
||||||
|
+
|
||||||
|
+ free (service_id);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ free (service_id);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *session_id = NULL;
|
||||||
|
+ ret = FALSE;
|
||||||
|
+
|
||||||
|
+out:
|
||||||
|
+ if (sessions) {
|
||||||
|
+ for (i = 0; sessions[i]; i ++) {
|
||||||
|
+ free (sessions[i]);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ free (sessions);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static GdmDisplay *
|
||||||
|
create_display (GdmLocalDisplayFactory *factory,
|
||||||
|
const char *seat_id,
|
||||||
|
const char *session_type,
|
||||||
|
gboolean initial)
|
||||||
|
{
|
||||||
|
GdmDisplayStore *store;
|
||||||
|
GdmDisplay *display = NULL;
|
||||||
|
+ char *active_session_id = NULL;
|
||||||
|
+ int ret;
|
||||||
|
|
||||||
|
- /* Ensure we don't create the same display more than once */
|
||||||
|
store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
|
||||||
|
- display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id);
|
||||||
|
- if (display != NULL) {
|
||||||
|
- return NULL;
|
||||||
|
+
|
||||||
|
+ ret = sd_seat_get_active (seat_id, &active_session_id, NULL);
|
||||||
|
+
|
||||||
|
+ if (ret == 0) {
|
||||||
|
+ char *login_session_id = NULL;
|
||||||
|
+
|
||||||
|
+ /* If we already have a login window, switch to it */
|
||||||
|
+ if (get_login_window_session_id (seat_id, &login_session_id)) {
|
||||||
|
+ if (g_strcmp0 (active_session_id, login_session_id) != 0) {
|
||||||
|
+ activate_session_id (factory, seat_id, login_session_id);
|
||||||
|
+ }
|
||||||
|
+ g_clear_pointer (&login_session_id, g_free);
|
||||||
|
+ g_clear_pointer (&active_session_id, g_free);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+ g_clear_pointer (&active_session_id, g_free);
|
||||||
|
+ } else {
|
||||||
|
+ /* Ensure we don't create the same display more than once */
|
||||||
|
+ display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id);
|
||||||
|
+
|
||||||
|
+ if (display != NULL) {
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
g_debug ("GdmLocalDisplayFactory: Adding display on seat %s", seat_id);
|
||||||
|
|
||||||
|
#ifdef ENABLE_USER_DISPLAY_SERVER
|
||||||
|
if (g_strcmp0 (seat_id, "seat0") == 0) {
|
||||||
|
display = gdm_local_display_new ();
|
||||||
|
if (session_type != NULL) {
|
||||||
|
g_object_set (G_OBJECT (display), "session-type", session_type, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (display == NULL) {
|
||||||
|
guint32 num;
|
||||||
|
|
||||||
|
num = take_next_display_number (factory);
|
||||||
|
|
||||||
|
display = gdm_legacy_display_new (num);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_set (display, "seat-id", seat_id, NULL);
|
||||||
|
g_object_set (display, "is-initial", initial, NULL);
|
||||||
|
|
||||||
|
store_display (factory, display);
|
||||||
|
|
||||||
|
/* let store own the ref */
|
||||||
|
g_object_unref (display);
|
||||||
|
|
||||||
|
if (! gdm_display_manage (display)) {
|
||||||
|
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
|
||||||
|
index 34ee74033..031c61ce6 100644
|
||||||
|
--- a/daemon/gdm-manager.c
|
||||||
|
+++ b/daemon/gdm-manager.c
|
||||||
|
@@ -1318,171 +1318,118 @@ maybe_start_pending_initial_login (GdmManager *manager,
|
||||||
|
g_free (user_session_seat_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
get_login_window_session_id (const char *seat_id,
|
||||||
|
char **session_id)
|
||||||
|
{
|
||||||
|
gboolean ret;
|
||||||
|
int res, i;
|
||||||
|
char **sessions;
|
||||||
|
char *service_id;
|
||||||
|
char *service_class;
|
||||||
|
char *state;
|
||||||
|
|
||||||
|
res = sd_seat_get_sessions (seat_id, &sessions, NULL, NULL);
|
||||||
|
if (res < 0) {
|
||||||
|
g_debug ("Failed to determine sessions: %s", strerror (-res));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sessions == NULL || sessions[0] == NULL) {
|
||||||
|
*session_id = NULL;
|
||||||
|
ret = FALSE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; sessions[i]; i ++) {
|
||||||
|
|
||||||
|
res = sd_session_get_class (sessions[i], &service_class);
|
||||||
|
if (res < 0) {
|
||||||
|
- if (res == -ENOENT || res == -ENXIO) {
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
g_debug ("failed to determine class of session %s: %s", sessions[i], strerror (-res));
|
||||||
|
ret = FALSE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp (service_class, "greeter") != 0) {
|
||||||
|
free (service_class);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
free (service_class);
|
||||||
|
|
||||||
|
ret = sd_session_get_state (sessions[i], &state);
|
||||||
|
if (ret < 0) {
|
||||||
|
- if (res == -ENOENT || res == -ENXIO)
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
g_debug ("failed to determine state of session %s: %s", sessions[i], strerror (-res));
|
||||||
|
ret = FALSE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_strcmp0 (state, "closing") == 0) {
|
||||||
|
free (state);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
free (state);
|
||||||
|
|
||||||
|
res = sd_session_get_service (sessions[i], &service_id);
|
||||||
|
if (res < 0) {
|
||||||
|
- if (res == -ENOENT || res == -ENXIO)
|
||||||
|
- continue;
|
||||||
|
g_debug ("failed to determine service of session %s: %s", sessions[i], strerror (-res));
|
||||||
|
ret = FALSE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp (service_id, "gdm-launch-environment") == 0) {
|
||||||
|
*session_id = g_strdup (sessions[i]);
|
||||||
|
ret = TRUE;
|
||||||
|
|
||||||
|
free (service_id);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
free (service_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
*session_id = NULL;
|
||||||
|
ret = FALSE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (sessions) {
|
||||||
|
for (i = 0; sessions[i]; i ++) {
|
||||||
|
free (sessions[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
free (sessions);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-activate_login_window_session_on_seat (GdmManager *self,
|
||||||
|
- const char *seat_id)
|
||||||
|
-{
|
||||||
|
- char *session_id;
|
||||||
|
-
|
||||||
|
- if (!get_login_window_session_id (seat_id, &session_id)) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- activate_session_id (self, seat_id, session_id);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static void
|
||||||
|
-maybe_activate_other_session (GdmManager *self,
|
||||||
|
- GdmDisplay *old_display)
|
||||||
|
-{
|
||||||
|
- char *seat_id = NULL;
|
||||||
|
- char *session_id = NULL;
|
||||||
|
- int ret;
|
||||||
|
-
|
||||||
|
- g_object_get (G_OBJECT (old_display),
|
||||||
|
- "seat-id", &seat_id,
|
||||||
|
- NULL);
|
||||||
|
-
|
||||||
|
- ret = sd_seat_get_active (seat_id, &session_id, NULL);
|
||||||
|
-
|
||||||
|
- if (ret == 0) {
|
||||||
|
- GdmDisplay *display;
|
||||||
|
-
|
||||||
|
- display = gdm_display_store_find (self->priv->display_store,
|
||||||
|
- lookup_by_session_id,
|
||||||
|
- (gpointer) session_id);
|
||||||
|
-
|
||||||
|
- if (display == NULL || gdm_display_get_status (display) == GDM_DISPLAY_FINISHED) {
|
||||||
|
- activate_login_window_session_on_seat (self, seat_id);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- g_free (session_id);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- g_free (seat_id);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static const char *
|
||||||
|
get_username_for_greeter_display (GdmManager *manager,
|
||||||
|
GdmDisplay *display)
|
||||||
|
{
|
||||||
|
gboolean doing_initial_setup = FALSE;
|
||||||
|
|
||||||
|
g_object_get (G_OBJECT (display),
|
||||||
|
"doing-initial-setup", &doing_initial_setup,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (doing_initial_setup) {
|
||||||
|
return INITIAL_SETUP_USERNAME;
|
||||||
|
} else {
|
||||||
|
return GDM_USERNAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_up_automatic_login_session (GdmManager *manager,
|
||||||
|
GdmDisplay *display)
|
||||||
|
{
|
||||||
|
GdmSession *session;
|
||||||
|
char *display_session_type = NULL;
|
||||||
|
gboolean is_initial;
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
|
||||||
|
@@ -1674,61 +1621,60 @@ on_display_status_changed (GdmDisplay *display,
|
||||||
|
if ((display_number == -1 && status == GDM_DISPLAY_PREPARED) ||
|
||||||
|
(display_number != -1 && status == GDM_DISPLAY_MANAGED)) {
|
||||||
|
char *session_class;
|
||||||
|
|
||||||
|
g_object_get (display,
|
||||||
|
"session-class", &session_class,
|
||||||
|
NULL);
|
||||||
|
if (g_strcmp0 (session_class, "greeter") == 0)
|
||||||
|
set_up_session (manager, display);
|
||||||
|
g_free (session_class);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == GDM_DISPLAY_MANAGED) {
|
||||||
|
greeter_display_started (manager, display);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GDM_DISPLAY_FAILED:
|
||||||
|
case GDM_DISPLAY_UNMANAGED:
|
||||||
|
case GDM_DISPLAY_FINISHED:
|
||||||
|
#ifdef WITH_PLYMOUTH
|
||||||
|
if (quit_plymouth) {
|
||||||
|
plymouth_quit_without_transition ();
|
||||||
|
manager->priv->plymouth_is_running = FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (status == GDM_DISPLAY_FINISHED || g_strcmp0 (session_type, "x11") == 0) {
|
||||||
|
manager->priv->ran_once = TRUE;
|
||||||
|
}
|
||||||
|
maybe_start_pending_initial_login (manager, display);
|
||||||
|
- maybe_activate_other_session (manager, display);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_display_removed (GdmDisplayStore *display_store,
|
||||||
|
const char *id,
|
||||||
|
GdmManager *manager)
|
||||||
|
{
|
||||||
|
GdmDisplay *display;
|
||||||
|
|
||||||
|
display = gdm_display_store_lookup (display_store, id);
|
||||||
|
if (display != NULL) {
|
||||||
|
g_dbus_object_manager_server_unexport (manager->priv->object_manager, id);
|
||||||
|
|
||||||
|
g_signal_handlers_disconnect_by_func (display, G_CALLBACK (on_display_status_changed), manager);
|
||||||
|
|
||||||
|
g_signal_emit (manager, signals[DISPLAY_REMOVED], 0, id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
destroy_start_user_session_operation (StartUserSessionOperation *operation)
|
||||||
|
{
|
||||||
|
g_object_set_data (G_OBJECT (operation->session),
|
||||||
|
"start-user-session-operation",
|
||||||
|
NULL);
|
||||||
|
--
|
||||||
|
2.19.0
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
From 91eee14bcd2447d78ad00e3de9d4380e423cb897 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Mon, 24 Sep 2018 10:53:53 -0400
|
||||||
|
Subject: [PATCH 6/6] daemon: ensure is-initial bit is transferred to new login
|
||||||
|
screen at logout
|
||||||
|
|
||||||
|
At the moment, when a user logs out we call sync_seats to restart the
|
||||||
|
login screen. sync_seats doesn't know whether or not vt1 is occupied.
|
||||||
|
|
||||||
|
This commit changes the code to call the more targeted `create_display`
|
||||||
|
function, which we can inform of vt1's availability by the is_initial
|
||||||
|
flag.
|
||||||
|
---
|
||||||
|
daemon/gdm-local-display-factory.c | 8 +++-----
|
||||||
|
1 file changed, 3 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
|
||||||
|
index cf852b55a..9a07f03ed 100644
|
||||||
|
--- a/daemon/gdm-local-display-factory.c
|
||||||
|
+++ b/daemon/gdm-local-display-factory.c
|
||||||
|
@@ -257,70 +257,68 @@ on_display_status_changed (GdmDisplay *display,
|
||||||
|
char *session_type = NULL;
|
||||||
|
char *session_class = NULL;
|
||||||
|
gboolean is_initial = TRUE;
|
||||||
|
gboolean is_local = TRUE;
|
||||||
|
|
||||||
|
num = -1;
|
||||||
|
gdm_display_get_x11_display_number (display, &num, NULL);
|
||||||
|
|
||||||
|
store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
|
||||||
|
|
||||||
|
g_object_get (display,
|
||||||
|
"seat-id", &seat_id,
|
||||||
|
"is-initial", &is_initial,
|
||||||
|
"is-local", &is_local,
|
||||||
|
"session-type", &session_type,
|
||||||
|
"session-class", &session_class,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
status = gdm_display_get_status (display);
|
||||||
|
|
||||||
|
g_debug ("GdmLocalDisplayFactory: display status changed: %d", status);
|
||||||
|
switch (status) {
|
||||||
|
case GDM_DISPLAY_FINISHED:
|
||||||
|
/* remove the display number from factory->priv->used_display_numbers
|
||||||
|
so that it may be reused */
|
||||||
|
if (num != -1) {
|
||||||
|
g_hash_table_remove (factory->priv->used_display_numbers, GUINT_TO_POINTER (num));
|
||||||
|
}
|
||||||
|
gdm_display_store_remove (store, display);
|
||||||
|
|
||||||
|
- /* if this is a local display, do a full resync. Only
|
||||||
|
- * seats without displays will get created anyway. This
|
||||||
|
- * ensures we get a new login screen when the user logs out,
|
||||||
|
- * if there isn't one.
|
||||||
|
+ /* if this is a local display, recreate the display so
|
||||||
|
+ * a new login screen comes up if one is missing.
|
||||||
|
*/
|
||||||
|
if (is_local && g_strcmp0 (session_class, "greeter") != 0) {
|
||||||
|
/* reset num failures */
|
||||||
|
factory->priv->num_failures = 0;
|
||||||
|
|
||||||
|
- gdm_local_display_factory_sync_seats (factory);
|
||||||
|
+ create_display (factory, seat_id, session_type, is_initial);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GDM_DISPLAY_FAILED:
|
||||||
|
/* leave the display number in factory->priv->used_display_numbers
|
||||||
|
so that it doesn't get reused */
|
||||||
|
gdm_display_store_remove (store, display);
|
||||||
|
|
||||||
|
/* Create a new equivalent display if it was static */
|
||||||
|
if (is_local) {
|
||||||
|
|
||||||
|
factory->priv->num_failures++;
|
||||||
|
|
||||||
|
if (factory->priv->num_failures > MAX_DISPLAY_FAILURES) {
|
||||||
|
/* oh shit */
|
||||||
|
g_warning ("GdmLocalDisplayFactory: maximum number of X display failures reached: check X server log for errors");
|
||||||
|
} else {
|
||||||
|
#ifdef ENABLE_WAYLAND_SUPPORT
|
||||||
|
if (g_strcmp0 (session_type, "wayland") == 0) {
|
||||||
|
g_free (session_type);
|
||||||
|
session_type = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
create_display (factory, seat_id, session_type, is_initial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GDM_DISPLAY_UNMANAGED:
|
||||||
|
break;
|
||||||
|
case GDM_DISPLAY_PREPARED:
|
||||||
|
--
|
||||||
|
2.19.0
|
||||||
|
|
6953
SOURCES/ja.po
6953
SOURCES/ja.po
File diff suppressed because it is too large
Load Diff
132
SPECS/gdm.spec
132
SPECS/gdm.spec
|
@ -2,30 +2,25 @@
|
||||||
%global _hardened_build 1
|
%global _hardened_build 1
|
||||||
|
|
||||||
%define libauditver 1.0.6
|
%define libauditver 1.0.6
|
||||||
%define pango_version 1.2.0
|
|
||||||
%define gtk3_version 2.99.2
|
%define gtk3_version 2.99.2
|
||||||
%define pam_version 0.99.8.1-11
|
%define pam_version 0.99.8.1-11
|
||||||
%define desktop_file_utils_version 0.2.90
|
%define desktop_file_utils_version 0.2.90
|
||||||
%define nss_version 3.11.1
|
%define nss_version 3.11.1
|
||||||
%define fontconfig_version 2.6.0
|
|
||||||
|
|
||||||
Summary: The GNOME Display Manager
|
|
||||||
Name: gdm
|
Name: gdm
|
||||||
Version: 3.26.2.1
|
|
||||||
Release: 5%{?dist}
|
|
||||||
Epoch: 1
|
Epoch: 1
|
||||||
|
Version: 3.28.2
|
||||||
|
Release: 9%{?dist}
|
||||||
|
Summary: The GNOME Display Manager
|
||||||
|
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
Group: User Interface/X
|
URL: https://wiki.gnome.org/Projects/GDM
|
||||||
URL: http://download.gnome.org/sources/gdm
|
Source0: http://download.gnome.org/sources/gdm/3.28/gdm-%{version}.tar.xz
|
||||||
#VCS: git:git://git.gnome.org/gdm
|
|
||||||
Source: http://download.gnome.org/sources/gdm/3.22/gdm-%{version}.tar.xz
|
|
||||||
Source1: org.gnome.login-screen.gschema.override
|
Source1: org.gnome.login-screen.gschema.override
|
||||||
Source2: ja.po
|
Source2: ja.po
|
||||||
|
|
||||||
Patch0: 0001-Honor-initial-setup-being-disabled-by-distro-install.patch
|
Patch0: 0001-Honor-initial-setup-being-disabled-by-distro-install.patch
|
||||||
|
|
||||||
patch10: 0001-Revert-session-don-t-call-gdm_session_defaults_chang.patch
|
|
||||||
|
|
||||||
Patch20: 0001-Revert-session-forward-is-initial-from-display-to-wo.patch
|
Patch20: 0001-Revert-session-forward-is-initial-from-display-to-wo.patch
|
||||||
Patch21: 0001-worker-add-compat-patch-to-make-new-worker-work-with.patch
|
Patch21: 0001-worker-add-compat-patch-to-make-new-worker-work-with.patch
|
||||||
|
|
||||||
|
@ -34,6 +29,17 @@ Patch40: 0001-Revert-data-Add-gnome-login.session.patch
|
||||||
# we don't have new enough dbus for this and don't need it with our old dbus
|
# we don't have new enough dbus for this and don't need it with our old dbus
|
||||||
Patch41: 0001-Revert-gdm-sessions-force-a-session-bus-for-non-seat.patch
|
Patch41: 0001-Revert-gdm-sessions-force-a-session-bus-for-non-seat.patch
|
||||||
|
|
||||||
|
Patch50: 0001-data-change-cirrus-blacklist-to-use-gdm-disable-wayl.patch
|
||||||
|
|
||||||
|
Patch60: 0001-manager-plug-leak-in-maybe_activate_other_session.patch
|
||||||
|
Patch61: 0002-manager-start-login-screen-if-old-one-is-finished.patch
|
||||||
|
Patch62: 0003-manager-don-t-bail-if-session-disappears-out-from-un.patch
|
||||||
|
Patch63: 0004-manager-make-get_login_window_session_id-fail-if-no-.patch
|
||||||
|
Patch64: 0005-daemon-try-harder-to-get-to-a-login-screen-at-logout.patch
|
||||||
|
Patch65: 0006-daemon-ensure-is-initial-bit-is-transferred-to-new-l.patch
|
||||||
|
|
||||||
|
Patch70: 0001-daemon-gdm-session-record.c-open-close-the-utmp-data.patch
|
||||||
|
|
||||||
Patch90: audit-4.patch
|
Patch90: audit-4.patch
|
||||||
Patch91: clear-screen.patch
|
Patch91: clear-screen.patch
|
||||||
Patch92: 0001-gdm.conf-custom.in-strip-out-reference-to-wayland.patch
|
Patch92: 0001-gdm.conf-custom.in-strip-out-reference-to-wayland.patch
|
||||||
|
@ -41,18 +47,19 @@ Patch93: system-dconf.patch
|
||||||
Patch94: classic-session.patch
|
Patch94: classic-session.patch
|
||||||
Patch95: 0001-data-drop-pam_gdm-reintroduce-pam_env-postlogin.patch
|
Patch95: 0001-data-drop-pam_gdm-reintroduce-pam_env-postlogin.patch
|
||||||
|
|
||||||
BuildRequires: git
|
|
||||||
BuildRequires: pam-devel >= 0:%{pam_version}
|
BuildRequires: pam-devel >= 0:%{pam_version}
|
||||||
BuildRequires: desktop-file-utils >= %{desktop_file_utils_version}
|
BuildRequires: desktop-file-utils >= %{desktop_file_utils_version}
|
||||||
BuildRequires: libtool automake autoconf
|
BuildRequires: libtool automake autoconf
|
||||||
BuildRequires: libattr-devel
|
BuildRequires: libattr-devel
|
||||||
BuildRequires: gettext
|
BuildRequires: gettext
|
||||||
|
BuildRequires: git
|
||||||
BuildRequires: libdmx-devel
|
BuildRequires: libdmx-devel
|
||||||
BuildRequires: audit-libs-devel >= %{libauditver}
|
BuildRequires: audit-libs-devel >= %{libauditver}
|
||||||
BuildRequires: autoconf automake libtool
|
BuildRequires: autoconf automake libtool
|
||||||
BuildRequires: intltool
|
BuildRequires: intltool
|
||||||
%ifnarch s390 s390x ppc ppc64
|
%ifnarch s390 s390x ppc ppc64
|
||||||
BuildRequires: xorg-x11-server-Xorg
|
BuildRequires: xorg-x11-server-Xorg
|
||||||
|
BuildRequires: pkgconfig(xorg-server)
|
||||||
%endif
|
%endif
|
||||||
BuildRequires: nss-devel >= %{nss_version}
|
BuildRequires: nss-devel >= %{nss_version}
|
||||||
BuildRequires: pkgconfig(accountsservice) >= 0.6.3
|
BuildRequires: pkgconfig(accountsservice) >= 0.6.3
|
||||||
|
@ -85,7 +92,7 @@ Requires: dconf
|
||||||
# since we use it, and pam spams the log if the module is missing
|
# since we use it, and pam spams the log if the module is missing
|
||||||
Requires: gnome-keyring-pam
|
Requires: gnome-keyring-pam
|
||||||
Requires: gnome-session
|
Requires: gnome-session
|
||||||
Requires: gnome-settings-daemon >= 2.21.92
|
Requires: gnome-settings-daemon >= 3.27.90
|
||||||
Requires: gnome-shell
|
Requires: gnome-shell
|
||||||
Requires: iso-codes
|
Requires: iso-codes
|
||||||
# We need 1.0.4-5 since it lets us use "localhost" in auth cookies
|
# We need 1.0.4-5 since it lets us use "localhost" in auth cookies
|
||||||
|
@ -110,12 +117,17 @@ Obsoletes: gdm-plugin-fingerprint < 1:3.2.1
|
||||||
Provides: gdm-plugin-fingerprint = %{epoch}:%{version}-%{release}
|
Provides: gdm-plugin-fingerprint = %{epoch}:%{version}-%{release}
|
||||||
|
|
||||||
%description
|
%description
|
||||||
GDM provides the graphical login screen, shown shortly after boot up,
|
GDM, the GNOME Display Manager, handles authentication-related backend
|
||||||
log out, and when user-switching.
|
functionality for logging in a user and unlocking the user's session after
|
||||||
|
it's been locked. GDM also provides functionality for initiating user-switching,
|
||||||
|
so more than one user can be logged in at the same time. It handles
|
||||||
|
graphical session registration with the system for both local and remote
|
||||||
|
sessions (in the latter case, via the XDMCP protocol). In cases where the
|
||||||
|
session doesn't provide it's own display server, GDM can start the display
|
||||||
|
server on behalf of the session.
|
||||||
|
|
||||||
%package devel
|
%package devel
|
||||||
Summary: Development files for gdm
|
Summary: Development files for gdm
|
||||||
Group: Development/Libraries
|
|
||||||
Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release}
|
Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release}
|
||||||
Requires: gdm-pam-extensions-devel = %{epoch}:%{version}-%{release}
|
Requires: gdm-pam-extensions-devel = %{epoch}:%{version}-%{release}
|
||||||
|
|
||||||
|
@ -127,6 +139,8 @@ files needed to build custom greeters.
|
||||||
Summary: Macros for developing GDM extensions to PAM
|
Summary: Macros for developing GDM extensions to PAM
|
||||||
Group: Development/Libraries
|
Group: Development/Libraries
|
||||||
Requires: pam-devel
|
Requires: pam-devel
|
||||||
|
Obsoletes: gdm-pam-extensions < 1:3.28.2-5
|
||||||
|
Provides: gdm-pam-extensions = %{epoch}:%{version}-%{release}
|
||||||
|
|
||||||
%description pam-extensions-devel
|
%description pam-extensions-devel
|
||||||
The gdm-pam-extensions-devel package contains headers and other
|
The gdm-pam-extensions-devel package contains headers and other
|
||||||
|
@ -143,8 +157,6 @@ autoreconf --force --install --verbose
|
||||||
|
|
||||||
%build
|
%build
|
||||||
|
|
||||||
sed -i 's|/etc/redhat-release|/etc/powerel-release|' configure
|
|
||||||
|
|
||||||
%configure --with-pam-prefix=%{_sysconfdir} \
|
%configure --with-pam-prefix=%{_sysconfdir} \
|
||||||
--with-run-dir=/run/gdm \
|
--with-run-dir=/run/gdm \
|
||||||
--with-default-path="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin" \
|
--with-default-path="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin" \
|
||||||
|
@ -165,38 +177,31 @@ make %{?_smp_mflags}
|
||||||
|
|
||||||
|
|
||||||
%install
|
%install
|
||||||
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/gdm/Init
|
mkdir -p %{buildroot}%{_sysconfdir}/gdm/Init
|
||||||
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/gdm/PreSession
|
mkdir -p %{buildroot}%{_sysconfdir}/gdm/PreSession
|
||||||
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/gdm/PostSession
|
mkdir -p %{buildroot}%{_sysconfdir}/gdm/PostSession
|
||||||
|
|
||||||
make install DESTDIR=$RPM_BUILD_ROOT
|
make install DESTDIR=%{buildroot}
|
||||||
|
|
||||||
rm -f $RPM_BUILD_ROOT%{_sysconfdir}/pam.d/gdm
|
rm -f %{buildroot}%{_sysconfdir}/pam.d/gdm
|
||||||
|
|
||||||
# add logo to shell greeter
|
# add logo to shell greeter
|
||||||
cp %{SOURCE1} $RPM_BUILD_ROOT%{_datadir}/glib-2.0/schemas
|
cp -a %{SOURCE1} %{buildroot}%{_datadir}/glib-2.0/schemas
|
||||||
|
|
||||||
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/dconf/db/gdm.d/locks
|
|
||||||
|
|
||||||
# docs go elsewhere
|
# docs go elsewhere
|
||||||
rm -rf $RPM_BUILD_ROOT/%{_prefix}/doc
|
rm -rf %{buildroot}/%{_prefix}/doc
|
||||||
|
|
||||||
# create log dir
|
# create log dir
|
||||||
mkdir -p $RPM_BUILD_ROOT/var/log/gdm
|
mkdir -p %{buildroot}/var/log/gdm
|
||||||
|
|
||||||
# remove the gdm Xsession as we're using the xdm one
|
(cd %{buildroot}%{_sysconfdir}/gdm; ln -sf ../X11/xinit/Xsession .)
|
||||||
rm -f $RPM_BUILD_ROOT%{_sysconfdir}/gdm/Xsession
|
|
||||||
(cd $RPM_BUILD_ROOT%{_sysconfdir}/gdm; ln -sf ../X11/xinit/Xsession .)
|
|
||||||
|
|
||||||
rm -f $RPM_BUILD_ROOT%{_libdir}/gtk-2.0/modules/*.a
|
mkdir -p %{buildroot}%{_datadir}/gdm/autostart/LoginWindow
|
||||||
rm -f $RPM_BUILD_ROOT%{_libdir}/gtk-2.0/modules/*.la
|
|
||||||
|
|
||||||
mkdir -p $RPM_BUILD_ROOT%{_datadir}/gdm/autostart/LoginWindow
|
mkdir -p %{buildroot}/run/gdm
|
||||||
|
|
||||||
mkdir -p $RPM_BUILD_ROOT/run/gdm
|
find %{buildroot} -name '*.a' -delete
|
||||||
|
find %{buildroot} -name '*.la' -delete
|
||||||
find $RPM_BUILD_ROOT -name '*.a' -delete
|
|
||||||
find $RPM_BUILD_ROOT -name '*.la' -delete
|
|
||||||
|
|
||||||
%find_lang gdm --with-gnome
|
%find_lang gdm --with-gnome
|
||||||
|
|
||||||
|
@ -261,7 +266,6 @@ fi
|
||||||
%systemd_post gdm.service
|
%systemd_post gdm.service
|
||||||
|
|
||||||
%preun
|
%preun
|
||||||
%gconf_schema_remove gdm-simple-greeter
|
|
||||||
%systemd_preun gdm.service
|
%systemd_preun gdm.service
|
||||||
|
|
||||||
%postun
|
%postun
|
||||||
|
@ -285,8 +289,8 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor >&/dev/null || :
|
||||||
/usr/bin/glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
|
/usr/bin/glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
|
||||||
|
|
||||||
%files -f gdm.lang
|
%files -f gdm.lang
|
||||||
%doc AUTHORS COPYING NEWS README
|
%doc AUTHORS NEWS README
|
||||||
|
%license COPYING
|
||||||
%dir %{_sysconfdir}/gdm
|
%dir %{_sysconfdir}/gdm
|
||||||
%config(noreplace) %{_sysconfdir}/gdm/custom.conf
|
%config(noreplace) %{_sysconfdir}/gdm/custom.conf
|
||||||
%config %{_sysconfdir}/gdm/Init/*
|
%config %{_sysconfdir}/gdm/Init/*
|
||||||
|
@ -314,8 +318,13 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor >&/dev/null || :
|
||||||
%{_sbindir}/gdm
|
%{_sbindir}/gdm
|
||||||
%{_bindir}/gdmflexiserver
|
%{_bindir}/gdmflexiserver
|
||||||
%{_bindir}/gdm-screenshot
|
%{_bindir}/gdm-screenshot
|
||||||
|
%dir %{_datadir}/dconf
|
||||||
|
%dir %{_datadir}/dconf/profile
|
||||||
%{_datadir}/dconf/profile/gdm
|
%{_datadir}/dconf/profile/gdm
|
||||||
|
%dir %{_datadir}/gdm/greeter
|
||||||
|
%dir %{_datadir}/gdm/greeter/applications
|
||||||
%{_datadir}/gdm/greeter/applications/*
|
%{_datadir}/gdm/greeter/applications/*
|
||||||
|
%dir %{_datadir}/gdm/greeter/autostart
|
||||||
%{_datadir}/gdm/greeter/autostart/*
|
%{_datadir}/gdm/greeter/autostart/*
|
||||||
%{_datadir}/gdm/greeter-dconf-defaults
|
%{_datadir}/gdm/greeter-dconf-defaults
|
||||||
%{_datadir}/gdm/locale.alias
|
%{_datadir}/gdm/locale.alias
|
||||||
|
@ -327,19 +336,19 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor >&/dev/null || :
|
||||||
%attr(1770, gdm, gdm) %dir %{_localstatedir}/lib/gdm
|
%attr(1770, gdm, gdm) %dir %{_localstatedir}/lib/gdm
|
||||||
%attr(0711, root, gdm) %dir /run/gdm
|
%attr(0711, root, gdm) %dir /run/gdm
|
||||||
%attr(1755, root, gdm) %dir %{_localstatedir}/cache/gdm
|
%attr(1755, root, gdm) %dir %{_localstatedir}/cache/gdm
|
||||||
%dir %{_sysconfdir}/dconf/db/gdm.d/locks
|
|
||||||
%dir %{_sysconfdir}/dconf/db/gdm.d
|
|
||||||
%{_datadir}/icons/hicolor/*/*/*.png
|
%{_datadir}/icons/hicolor/*/*/*.png
|
||||||
%config %{_sysconfdir}/pam.d/gdm-pin
|
%config %{_sysconfdir}/pam.d/gdm-pin
|
||||||
%config %{_sysconfdir}/pam.d/gdm-smartcard
|
%config %{_sysconfdir}/pam.d/gdm-smartcard
|
||||||
%config %{_sysconfdir}/pam.d/gdm-fingerprint
|
%config %{_sysconfdir}/pam.d/gdm-fingerprint
|
||||||
%{_sysconfdir}/pam.d/gdm-launch-environment
|
%{_sysconfdir}/pam.d/gdm-launch-environment
|
||||||
|
%{_udevrulesdir}/61-gdm.rules
|
||||||
%{_unitdir}/gdm.service
|
%{_unitdir}/gdm.service
|
||||||
|
|
||||||
%files devel
|
%files devel
|
||||||
%dir %{_includedir}/gdm
|
%dir %{_includedir}/gdm
|
||||||
%{_includedir}/gdm/*.h
|
%{_includedir}/gdm/*.h
|
||||||
%exclude %{_includedir}/gdm/gdm-pam-extensions.h
|
%exclude %{_includedir}/gdm/gdm-pam-extensions.h
|
||||||
|
%dir %{_datadir}/gir-1.0
|
||||||
%{_datadir}/gir-1.0/Gdm-1.0.gir
|
%{_datadir}/gir-1.0/Gdm-1.0.gir
|
||||||
%{_libdir}/pkgconfig/gdm.pc
|
%{_libdir}/pkgconfig/gdm.pc
|
||||||
|
|
||||||
|
@ -348,6 +357,43 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor >&/dev/null || :
|
||||||
%{_libdir}/pkgconfig/gdm-pam-extensions.pc
|
%{_libdir}/pkgconfig/gdm-pam-extensions.pc
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Sep 24 2018 Ray Strode <rstrode@redhat.com> - 3.28.2-9
|
||||||
|
- fast user switching fix
|
||||||
|
Related: #1597339
|
||||||
|
|
||||||
|
* Tue Sep 04 2018 Ray Strode <rstrode@redhat.com> - 3.28.2-8
|
||||||
|
- Clear utmp entries properly
|
||||||
|
Resolves: #1600079
|
||||||
|
|
||||||
|
* Mon Jul 30 2018 Ray Strode <rstrode@redhat.com> - 3.28.2-7
|
||||||
|
- Another crack at the blank login screen problem
|
||||||
|
Resolves: #1489977
|
||||||
|
|
||||||
|
* Mon Jul 16 2018 Ray Strode <rstrode@redhat.com> - 3.28.2-6
|
||||||
|
- add gdm-pam-extension provides to fix upgrades
|
||||||
|
Resolves: #1601598
|
||||||
|
|
||||||
|
* Tue Jun 26 2018 Ray Strode <rstrode@redhat.com> - 3.28.2-5
|
||||||
|
- Fix double free
|
||||||
|
Related: #1489977
|
||||||
|
Resolves: 1594814
|
||||||
|
|
||||||
|
* Fri Jun 22 2018 Ray Strode <rstrode@redhat.com> - 3.28.2-4
|
||||||
|
- Fix blank login screen problem
|
||||||
|
Resolves: #1489977
|
||||||
|
|
||||||
|
* Wed Jun 20 2018 Ray Strode <rstrode@redhat.com> - 3.28.2-3
|
||||||
|
- Make udev script more friendly to RHEL 7 udev
|
||||||
|
Resolves: #1593356
|
||||||
|
|
||||||
|
* Tue May 29 2018 Ray Strode <rstrode@redhat.com> - 1:3.28.2-2
|
||||||
|
- Drop reference to gconf
|
||||||
|
Resolves: #1542702
|
||||||
|
|
||||||
|
* Thu May 17 2018 Kalev Lember <klember@redhat.com> - 1:3.28.2-1
|
||||||
|
- Update to 3.28.2
|
||||||
|
- Resolves: #1567200
|
||||||
|
|
||||||
* Wed Feb 14 2018 Ray Strode <rstrode@redhat.com> - 3.26.2.1-5
|
* Wed Feb 14 2018 Ray Strode <rstrode@redhat.com> - 3.26.2.1-5
|
||||||
- Fix bullet in session list
|
- Fix bullet in session list
|
||||||
Resolves: #1527145
|
Resolves: #1527145
|
||||||
|
|
Loading…
Reference in New Issue