diff options
author | Antonino A. Daplas <adaplas@gmail.com> | 2007-05-08 03:40:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-08 14:15:33 -0400 |
commit | 2ae854777592856ad8ce4d4cdb6114804e2e28f6 (patch) | |
tree | 49192562a7cbe6216442c6b3f3bee644f9a7091f /drivers/video/console/vgacon.c | |
parent | 32dd38030b3b4ca0aa18a5402059de27bf69ed6b (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.c | 5 |
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 | ||
661 | static void vgacon_cursor(struct vc_data *c, int mode) | 661 | static 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) |