dupuy@amsterdam.columbia.edu (Alexander Dupuy) (05/03/87)
There is a small bug in X/Xlib/XKeyBind.c relating to unbinding mappings.
I noticed it when my Sun 3.2 C compiler generated a warning.
cc -pg -O -I../include -c XKeyBind.c
"XKeyBind.c", line 289: warning: constant 1024 is out of range of unsigned char comparison
"XKeyBind.c", line 289: warning: value coerced to 0 for bug compatibility
"XKeyBind.c", line 289: warning: do not expect this coercion in release 4.0
mv XKeyBind.o profiled/XKeyBind.o
cc -O -I../include -c XKeyBind.c
"XKeyBind.c", line 289: warning: constant 1024 is out of range of unsigned char comparison
"XKeyBind.c", line 289: warning: value coerced to 0 for bug compatibility
"XKeyBind.c", line 289: warning: do not expect this coercion in release 4.0
When a runtime keybinding is undone, the metabits field is set to EMPTY_ENTRY,
which in XKeyBind.c is #defined as LeftMask (aka 0x0400). Unfortunately, the
metabits field in the sntry struct is defined as unsigned char. The fix is to
change EMPTY_ENTRY to 0x80, a value which can not be generated by the
FullKeyState() macro.
I'm surprised nobody else who compiled X on a Sun running 3.[234..] has found
this bug before (or maybe I just missed the posting).
@alex
here are the diffs for lazy people:
*** /u/src/X/Xlib/XKeyBind.c Sat Apr 4 15:36:07 1987
--- XKeyBind.c Sat May 2 23:10:39 1987
***************
*** 11,17 ****
#include <stdio.h>
#include <strings.h>
! #define EMPTY_ENTRY LeftMask
/* if the "metabits" field of a runtime table entry contains this,
it's an empty entry */
--- 11,19 ----
#include <stdio.h>
#include <strings.h>
! /* ad - this was LeftMask, but that's too big to fit in an unsigned char,
! so I changed it to 0x80, which can't be generated by {,Full}KeyState() */
! #define EMPTY_ENTRY 0x80
/* if the "metabits" field of a runtime table entry contains this,
it's an empty entry */
---
arpanet: dupuy@columbia.edu
uucp: ...!seismo!columbia!dupuy