Patch "tty/vt/keyboard: fix OOB access in do_compute_shiftstate()" has been added to the 3.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
tty/vt/keyboard: fix OOB access in do_compute_shiftstate()
to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
tty-vt-keyboard-fix-oob-access-in-do_compute_shiftstate.patch
and it can be found in the queue-3.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
510cccb5b0c8868a2b302a0ab524da7912da648bMon Sep 17 00:00:00 2001
From: Dmitry Torokhov <[email protected]>
Date: Mon, 27 Jun 2016 14:12:34 -0700
Subject: tty/vt/keyboard: fix OOB access in do_compute_shiftstate()
From: Dmitry Torokhov <[email protected]>
commit 510cccb5b0c8868a2b302a0ab524da7912da648b upstream.
The size of individual keymap in drivers/tty/vt/keyboard.c is NR_KEYS, which is currently 256, whereas number of keys/buttons in input device (and therefor in key_down) is much larger - KEY_CNT - 768, and that can cause out-of-bound access when we do
sym = U(key_maps[0][k]);
with large 'k'.
To fix it we should not attempt iterating beyond smaller of NR_KEYS and KEY_CNT.
Also while at it let's switch to for_each_set_bit() instead of open-coding it.
--- drivers/tty/vt/keyboard.c | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-)
drivers/tty/vt/keyboard.c +9 -21
@@ -365,34 +365,22 @@ static void to_utf8(struct vc_data *vc,static void do_compute_shiftstate (void ) { -unsigned int i, j, k, sym, val; +unsigned int k, sym, val; shift_state =0 ;memset (shift_down,0 ,sizeof (shift_down)); -for (i =0 ; i <ARRAY_SIZE (key_down); i++) { - -if (!key_down[i]) +for_each_set_bit (k, key_down,min (NR_KEYS ,KEY_CNT )) { + sym =U (key_maps[0 ][k]); +if (KTYP (sym) !=KT_SHIFT &&KTYP (sym) !=KT_SLOCK )continue ; - k = i *BITS_PER_LONG ; - -for (j =0 ; j <BITS_PER_LONG ; j++, k++) { - -if (!test_bit (k, key_down)) -continue ; - - sym =U (key_maps[0 ][k]); -if (KTYP (sym) !=KT_SHIFT &&KTYP (sym) !=KT_SLOCK ) -continue ; - - val =KVAL (sym); -if (val ==KVAL (K_CAPSSHIFT )) - val =KVAL (K_SHIFT ); + val =KVAL (sym); +if (val ==KVAL (K_CAPSSHIFT )) + val =KVAL (K_SHIFT ); - shift_down[val]++; - shift_state |= (1 << val); - } + shift_down[val]++; + shift_state |=BIT (val); } }
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/tty-vt-keyboard-fix-oob-access-in-do_compute_shiftstate.patch