Blame SOURCES/0018-session-worker-fix-current-vt-detection-short-circui.patch

400dab
From b9e5a2879a410b6a85be6c01c6f49cd7eb24c800 Mon Sep 17 00:00:00 2001
400dab
From: Ray Strode <rstrode@redhat.com>
400dab
Date: Fri, 31 Aug 2018 15:20:39 -0400
400dab
Subject: [PATCH 18/51] session-worker: fix current vt detection short-circuit
400dab
 logic
400dab
400dab
commit 8169cd4 attempts to avoid changing VTs if the active VT
400dab
is the same as the VT getting jumped to.
400dab
400dab
It fails to work, however, because accidentally treats a 0 return
400dab
code to the VT_GETSTATE ioctl as failure.
400dab
400dab
this commit fixes that.
400dab
---
400dab
 daemon/gdm-session-worker.c | 2 +-
400dab
 1 file changed, 1 insertion(+), 1 deletion(-)
400dab
400dab
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
400dab
index fd6470bab..391969d96 100644
400dab
--- a/daemon/gdm-session-worker.c
400dab
+++ b/daemon/gdm-session-worker.c
400dab
@@ -963,61 +963,61 @@ jump_to_vt (GdmSessionWorker  *worker,
400dab
 {
400dab
         int fd;
400dab
         int active_vt_tty_fd;
400dab
         int active_vt = -1;
400dab
         struct vt_stat vt_state = { 0 };
400dab
 
400dab
         g_debug ("GdmSessionWorker: jumping to VT %d", vt_number);
400dab
         active_vt_tty_fd = open ("/dev/tty0", O_RDWR | O_NOCTTY);
400dab
 
400dab
         if (worker->priv->session_tty_fd != -1) {
400dab
                 fd = worker->priv->session_tty_fd;
400dab
 
400dab
                 g_debug ("GdmSessionWorker: first setting graphics mode to prevent flicker");
400dab
                 if (ioctl (fd, KDSETMODE, KD_GRAPHICS) < 0) {
400dab
                         g_debug ("GdmSessionWorker: couldn't set graphics mode: %m");
400dab
                 }
400dab
 
400dab
                 /* It's possible that the current VT was left in a broken
400dab
                  * combination of states (KD_GRAPHICS with VT_AUTO), that
400dab
                  * can't be switched away from.  This call makes sure things
400dab
                  * are set in a way that VT_ACTIVATE should work and
400dab
                  * VT_WAITACTIVE shouldn't hang.
400dab
                  */
400dab
                 fix_terminal_vt_mode (worker, active_vt_tty_fd);
400dab
         } else {
400dab
                 fd = active_vt_tty_fd;
400dab
         }
400dab
 
400dab
         handle_terminal_vt_switches (worker, fd);
400dab
 
400dab
-        if (ioctl (fd, VT_GETSTATE, &vt_state) <= 0) {
400dab
+        if (ioctl (fd, VT_GETSTATE, &vt_state) < 0) {
400dab
                 g_debug ("GdmSessionWorker: couldn't get current VT: %m");
400dab
         } else {
400dab
                 active_vt = vt_state.v_active;
400dab
         }
400dab
 
400dab
         if (active_vt != vt_number) {
400dab
                 if (ioctl (fd, VT_ACTIVATE, vt_number) < 0) {
400dab
                         g_debug ("GdmSessionWorker: couldn't initiate jump to VT %d: %m",
400dab
                                  vt_number);
400dab
                 } else if (ioctl (fd, VT_WAITACTIVE, vt_number) < 0) {
400dab
                         g_debug ("GdmSessionWorker: couldn't finalize jump to VT %d: %m",
400dab
                                  vt_number);
400dab
                 }
400dab
         }
400dab
 
400dab
         close (active_vt_tty_fd);
400dab
 }
400dab
 
400dab
 static void
400dab
 gdm_session_worker_set_state (GdmSessionWorker      *worker,
400dab
                               GdmSessionWorkerState  state)
400dab
 {
400dab
         if (worker->priv->state == state)
400dab
                 return;
400dab
 
400dab
         worker->priv->state = state;
400dab
         g_object_notify (G_OBJECT (worker), "state");
400dab
 }
400dab
 
400dab
 static void
400dab
-- 
400dab
2.27.0
400dab