[PATCH] setkeycode ioctl fix

From: Knut Petersen
Date: Fri Oct 24 2003 - 04:38:06 EST


Hi everybody,

This is a bugfix for setkeycode() in /drivers/char/keyboard.c.

If we change a keycode the corresponding bit should be cleared if and only if
this keycode is not defined any longer. I believe that this also was intended
with the original code, but the implementation is faulty.

First off all the first three changed lines are obviously erroneus: oldkey == truekey
is false or true, you do not need to inclose this in a for(). I believe the author
intended INPUT_KEYCODE(dev,i) == oldkey. But fixing this alone is not enough.

If somebody wants to interchange the definition of two keys A and B, the normal way
is to use two setkeycode calls:

setkeycode (scancode A, keycode B);
setkeycode (scancode B, keycode A);

The old code does a clearbit(oldkey ..) call even in situations where two keys have
the same definition, and this situation arises commonly in the situation mentioned
above.

Both errors are fixed with this patch.

As this is a pure and obvious bugfix, please include it before releasing 2.6.0-final.

The patch is against 2.6.0-test8-bk3, but the code of keyboard.c has not changed
for a long time.

cu,
Knut Petersen


--- drivers/char/keyboard.orig 2003-10-17 23:43:03.000000000 +0200
+++ drivers/char/keyboard.c 2003-10-24 12:17:36.000000000 +0200
@@ -204,13 +204,13 @@
oldkey = INPUT_KEYCODE(dev, scancode);
INPUT_KEYCODE(dev, scancode) = keycode;

- for (i = 0; i < dev->keycodemax; i++)
- if(keycode == oldkey)
- break;
- if (i == dev->keycodemax)
- clear_bit(oldkey, dev->keybit);
+ clear_bit(oldkey, dev->keybit);
set_bit(keycode, dev->keybit);
-
+
+ for (i = 0; i < dev->keycodemax; i++)
+ if(INPUT_KEYCODE(dev,i) == oldkey)
+ set_bit(oldkey, dev->keybit);
+
return 0;
}



-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/