aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/console/vgacon.c
diff options
context:
space:
mode:
authorAntonino A. Daplas <adaplas@gmail.com>2007-05-08 03:40:06 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-08 14:15:33 -0400
commit2ae854777592856ad8ce4d4cdb6114804e2e28f6 (patch)
tree49192562a7cbe6216442c6b3f3bee644f9a7091f /drivers/video/console/vgacon.c
parent32dd38030b3b4ca0aa18a5402059de27bf69ed6b (diff)
vgacon: disallow console operations when in KD_GRAPHICS mode
Reported by James Pearson as: boot to run level 3 if not root, then make sure /dev/console is writeable login and type: setterm -blank 0 start X type into an xterm: while true; do echo "" > /dev/console; usleep 100000; done while the above loop is running switch to the text console and back again (Ctrl-Alt-F1 then Ctrl-Alt-F7) ... and the screen will be shifting (and wrapping) to the left. This problem stems from continuously writing text to the system console (which is in KD_TEXT mode) while the foreground console is in KD_GRAPHICS mode. Somewhere along the way, console printing got confused and omitted the KD_GRAPHICS/KD_TEXT test. Thus, vgacon attempted to scroll the screen of X, which causes X to shift. Fix by disallowing vgacon to touch the hardware when the vc is in KD_GRAPHICS mode. A definitive fix entails a full audit of the console code. Signed-off-by: Antonino Daplas <adaplas@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/video/console/vgacon.c')
-rw-r--r--drivers/video/console/vgacon.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index d0d2733ef479..2460b82a1d93 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -660,6 +660,9 @@ static void vgacon_set_cursor_size(int xpos, int from, int to)
660 660
661static void vgacon_cursor(struct vc_data *c, int mode) 661static void vgacon_cursor(struct vc_data *c, int mode)
662{ 662{
663 if (c->vc_mode != KD_TEXT)
664 return;
665
663 vgacon_restore_screen(c); 666 vgacon_restore_screen(c);
664 667
665 switch (mode) { 668 switch (mode) {
@@ -1318,7 +1321,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
1318 unsigned long oldo; 1321 unsigned long oldo;
1319 unsigned int delta; 1322 unsigned int delta;
1320 1323
1321 if (t || b != c->vc_rows || vga_is_gfx) 1324 if (t || b != c->vc_rows || vga_is_gfx || c->vc_mode != KD_TEXT)
1322 return 0; 1325 return 0;
1323 1326
1324 if (!vga_hardscroll_enabled || lines >= c->vc_rows / 2) 1327 if (!vga_hardscroll_enabled || lines >= c->vc_rows / 2)