Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

vt: Add virtual console keyboard mode OFF

virtual console: add keyboard mode OFF

Add a new mode for the virtual console keyboard OFF in which all input
other than shift keys is ignored. Prevents vt input buffers from
overflowing when a program opens but doesn't read from a tty, like X11
using evdev for input.

Signed-off-by: Arthur Taylor <art@ified.ca>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Arthur Taylor and committed by
Greg Kroah-Hartman
9fc3de9c 8e6d3fe1

+9 -3
+3 -2
drivers/tty/vt/keyboard.c
··· 654 654 if (value >= ARRAY_SIZE(fn_handler)) 655 655 return; 656 656 if ((kbd->kbdmode == VC_RAW || 657 - kbd->kbdmode == VC_MEDIUMRAW) && 657 + kbd->kbdmode == VC_MEDIUMRAW || 658 + kbd->kbdmode == VC_OFF) && 658 659 value != KVAL(K_SAK)) 659 660 return; /* SAK is allowed even in raw mode */ 660 661 fn_handler[value](vc); ··· 1296 1295 if (rc == NOTIFY_STOP) 1297 1296 return; 1298 1297 1299 - if (raw_mode && type != KT_SPEC && type != KT_SHIFT) 1298 + if ((raw_mode || kbd->kbdmode == VC_OFF) && type != KT_SPEC && type != KT_SHIFT) 1300 1299 return; 1301 1300 1302 1301 (*k_handler[type])(vc, keysym & 0xff, !down);
+3
drivers/tty/vt/vt_ioctl.c
··· 688 688 kbd->kbdmode = VC_UNICODE; 689 689 compute_shiftstate(); 690 690 break; 691 + case K_OFF: 692 + kbd->kbdmode = VC_OFF; 693 + break; 691 694 default: 692 695 ret = -EINVAL; 693 696 goto out;
+2 -1
include/linux/kbd_kern.h
··· 50 50 #define VC_CAPSLOCK 2 /* capslock mode */ 51 51 #define VC_KANALOCK 3 /* kanalock mode */ 52 52 53 - unsigned char kbdmode:2; /* one 2-bit value */ 53 + unsigned char kbdmode:3; /* one 3-bit value */ 54 54 #define VC_XLATE 0 /* translate keycodes using keymap */ 55 55 #define VC_MEDIUMRAW 1 /* medium raw (keycode) mode */ 56 56 #define VC_RAW 2 /* raw (scancode) mode */ 57 57 #define VC_UNICODE 3 /* Unicode mode */ 58 + #define VC_OFF 4 /* disabled mode */ 58 59 59 60 unsigned char modeflags:5; 60 61 #define VC_APPLIC 0 /* application key mode */
+1
include/linux/kd.h
··· 81 81 #define K_XLATE 0x01 82 82 #define K_MEDIUMRAW 0x02 83 83 #define K_UNICODE 0x03 84 + #define K_OFF 0x04 84 85 #define KDGKBMODE 0x4B44 /* gets current keyboard mode */ 85 86 #define KDSKBMODE 0x4B45 /* sets current keyboard mode */ 86 87