linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] setkeycode ioctl fix
@ 2003-10-24  9:37 Knut Petersen
  0 siblings, 0 replies; only message in thread
From: Knut Petersen @ 2003-10-24  9:37 UTC (permalink / raw)
  To: 'linux-kernel@vger.kernel.org'; +Cc: Vojtech Pavlik, torvalds

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;
 }




^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-10-24  9:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-10-24  9:37 [PATCH] setkeycode ioctl fix Knut Petersen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).