Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a64314e6 authored by Jan Lübbe's avatar Jan Lübbe Committed by Linus Torvalds
Browse files

fix console change race exposed by CFS



The new behaviour of CFS exposes a race which occurs if a switch is
requested when vt_mode.mode is VT_PROCESS.

The process with vc->vt_pid is signaled before vc->vt_newvt is set.
This causes the switch to fail when triggered by the monitoing process
because the target is still -1.

[ If the signal sending fails, the subsequent "reset_vc(vc)" will then
  reset vt_newvt to -1, so this works for that case too.   - Linus ]

Signed-off-by: default avatarJan Lübbe <jluebbe@lasnet.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ed7fdff5
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -1208,15 +1208,18 @@ void change_console(struct vc_data *new_vc)
		/*
		 * Send the signal as privileged - kill_pid() will
		 * tell us if the process has gone or something else
		 * is awry
		 * is awry.
		 *
		 * We need to set vt_newvt *before* sending the signal or we
		 * have a race.
		 */
		vc->vt_newvt = new_vc->vc_num;
		if (kill_pid(vc->vt_pid, vc->vt_mode.relsig, 1) == 0) {
			/*
			 * It worked. Mark the vt to switch to and
			 * return. The process needs to send us a
			 * VT_RELDISP ioctl to complete the switch.
			 */
			vc->vt_newvt = new_vc->vc_num;
			return;
		}