vt:tackle kbd_table
Keyboard struct lifetime is easy, but the locking is not and is completely ignored by the existing code. Tackle this one head on - Make the kbd_table private so we can run down all direct users - Hoick the relevant ioctl handlers into the keyboard layer - Lock them with the keyboard lock so they don't change mid keypress - Add helpers for things like console stop/start so we isolate the poking around properly - Tweak the braille console so it still builds There are a couple of FIXME locking cases left for ioctls that are so hideous they should be addressed in a later patch. After this patch the kbd_table is private and all the keyboard jiggery pokery is in one place. This update fixes speakup and also a memory leak in the original. Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
0fb8379dab
commit
079c9534a9
@@ -30,6 +30,7 @@
|
||||
|
||||
extern void poke_blanked_console(void);
|
||||
|
||||
/* FIXME: all this needs locking */
|
||||
/* Variables for selection control. */
|
||||
/* Use a dynamic buffer, instead of static (Dec 1994) */
|
||||
struct vc_data *sel_cons; /* must not be deallocated */
|
||||
@@ -138,7 +139,7 @@ int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *t
|
||||
char *bp, *obp;
|
||||
int i, ps, pe, multiplier;
|
||||
u16 c;
|
||||
struct kbd_struct *kbd = kbd_table + fg_console;
|
||||
int mode;
|
||||
|
||||
poke_blanked_console();
|
||||
|
||||
@@ -182,7 +183,11 @@ int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *t
|
||||
clear_selection();
|
||||
sel_cons = vc_cons[fg_console].d;
|
||||
}
|
||||
use_unicode = kbd && kbd->kbdmode == VC_UNICODE;
|
||||
mode = vt_do_kdgkbmode(fg_console);
|
||||
if (mode == K_UNICODE)
|
||||
use_unicode = 1;
|
||||
else
|
||||
use_unicode = 0;
|
||||
|
||||
switch (sel_mode)
|
||||
{
|
||||
|
Reference in New Issue
Block a user