Index: dmitry/drivers/char/keyboard.c
===================================================================
--- dmitry.orig/drivers/char/keyboard.c	2005-07-05 16:23:15.000000000 +0200
+++ dmitry/drivers/char/keyboard.c	2005-07-05 16:26:08.000000000 +0200
@@ -198,10 +198,10 @@
 
 	if (scancode >= dev->keycodemax)
 		return -EINVAL;
-	if (keycode > KEY_MAX)
-		return -EINVAL;
 	if (keycode < 0 || keycode > KEY_MAX)
 		return -EINVAL;
+	if (keycode >> (dev->keycodesize * 8))
+		return -EINVAL;
 
 	oldkey = SET_INPUT_KEYCODE(dev, scancode, keycode);
 
Index: dmitry/drivers/input/evdev.c
===================================================================
--- dmitry.orig/drivers/input/evdev.c	2005-07-05 16:25:15.000000000 +0200
+++ dmitry/drivers/input/evdev.c	2005-07-05 16:26:08.000000000 +0200
@@ -320,6 +320,7 @@
 			if (t < 0 || t >= dev->keycodemax || !dev->keycodesize) return -EINVAL;
 			if (get_user(v, ip + 1)) return -EFAULT;
 			if (v < 0 || v > KEY_MAX) return -EINVAL;
+			if (v >> (dev->keycodesize * 8)) return -EINVAL;
 			u = SET_INPUT_KEYCODE(dev, t, v);
 			clear_bit(u, dev->keybit);
 			set_bit(v, dev->keybit);