[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/