diff options
author | Alan Jenkins <alan-jenkins@tuffmail.co.uk> | 2009-11-18 00:40:48 -0800 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2009-11-20 00:52:14 -0800 |
commit | 0c09b2ac35ff7c5f280e5cf8142ad0822f1c93b3 (patch) | |
tree | 91e207b9032e75988613f75fed949c43f60b3c21 | |
parent | 71bb21b677e89a2b438b804231f92b779beda5d7 (diff) | |
download | op-kernel-dev-0c09b2ac35ff7c5f280e5cf8142ad0822f1c93b3.zip op-kernel-dev-0c09b2ac35ff7c5f280e5cf8142ad0822f1c93b3.tar.gz |
Input: keyboard - fix theoretical race on vt switch
A VT switch can theoretically change fg_console between
vc = vc_cons[fg_console].d
and
kbd = kbd_table + fg_console
Fix it by replacing the second fg_console with vc->vc_num.
Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
-rw-r--r-- | drivers/char/keyboard.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c index 737be95..747683f 100644 --- a/drivers/char/keyboard.c +++ b/drivers/char/keyboard.c @@ -1136,7 +1136,7 @@ static int emulate_raw(struct vc_data *vc, unsigned int keycode, unsigned char u static void kbd_rawcode(unsigned char data) { struct vc_data *vc = vc_cons[fg_console].d; - kbd = kbd_table + fg_console; + kbd = kbd_table + vc->vc_num; if (kbd->kbdmode == VC_RAW) put_queue(vc, data); } @@ -1157,7 +1157,7 @@ static void kbd_keycode(unsigned int keycode, int down, int hw_raw) tty->driver_data = vc; } - kbd = kbd_table + fg_console; + kbd = kbd_table + vc->vc_num; if (keycode == KEY_LEFTALT || keycode == KEY_RIGHTALT) sysrq_alt = down ? keycode : 0; |