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

Commit f991519c authored by Michal Januszewski's avatar Michal Januszewski Committed by Linus Torvalds
Browse files

[PATCH] vt: fix potential race in VT_WAITACTIVE handler



On a multiprocessor machine the VT_WAITACTIVE ioctl call may return 0 if
fg_console has already been updated in redraw_screen() but the console
switch itself hasn't been completed.  Fix this by checking fg_console in
vt_waitactive() with the console sem held.

Signed-off-by: default avatarMichal Januszewski <spock@gentoo.org>
Acked-by: default avatarAntonino Daplas <adaplas@pol.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 1d64b9cb
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -1039,10 +1039,22 @@ int vt_waitactive(int vt)

	add_wait_queue(&vt_activate_queue, &wait);
	for (;;) {
		set_current_state(TASK_INTERRUPTIBLE);
		retval = 0;
		if (vt == fg_console)

		/*
		 * Synchronize with redraw_screen(). By acquiring the console
		 * semaphore we make sure that the console switch is completed
		 * before we return. If we didn't wait for the semaphore, we
		 * could return at a point where fg_console has already been
		 * updated, but the console switch hasn't been completed.
		 */
		acquire_console_sem();
		set_current_state(TASK_INTERRUPTIBLE);
		if (vt == fg_console) {
			release_console_sem();
			break;
		}
		release_console_sem();
		retval = -EINTR;
		if (signal_pending(current))
			break;