xserver/xkb
Olivier Fourdan 92bcebfd7e xkb: Always use MAP_LENGTH keymap size
Generating the modifier modmap, the helper function generate_modkeymap()
would check the entire range up to the MAP_LENGTH.

However, the given keymap might have less keycodes than MAP_LENGTH, in
which case we would go beyond the size of the modmap, as reported by
ASAN:

==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 1 at 0x5110001c225b thread T0
    #0 0x5e7369393873 in generate_modkeymap ../dix/inpututils.c:309
    #1 0x5e736930dcce in ProcGetModifierMapping ../dix/devices.c:1794
    #2 0x5e7369336489 in Dispatch ../dix/dispatch.c:550
    #3 0x5e736934407d in dix_main ../dix/main.c:275
    #5 0x7e46d47b2ecb in __libc_start_main
    #6 0x5e73691be324 in _start (xserver/build/hw/xwayland/Xwayland)

Address is located 0 bytes after 219-byte region
allocated by thread T0 here:
    #0 0x7e46d4cfc542 in realloc
    #1 0x5e73695aa90e in _XkbCopyClientMap ../xkb/xkbUtils.c:1142
    #2 0x5e73695aa90e in XkbCopyKeymap ../xkb/xkbUtils.c:1966
    #3 0x5e73695b1b2f in XkbDeviceApplyKeymap ../xkb/xkbUtils.c:2023
    #4 0x5e73691c6c18 in keyboard_handle_keymap ../hw/xwayland/xwayland-input.c:1194

As MAP_LENGTH is used in various code paths where the max keycode might
not be easily available, best is to always use MAP_LENGTH to allocate the
keymaps so that the code never run past the buffer size.

If the max key code is smaller than the MAP_LENGTH limit, fill-in the gap
with zeros.

That also simplifies the code slightly as we do not constantly need to
reallocate the keymap to adjust to the max key code size.

Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1780
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1762>
2025-01-13 11:44:11 +01:00
..
README.compiled R6.6 is the Xorg base-line 2003-11-14 15:54:54 +00:00
XKBAlloc.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
XKBGAlloc.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
XKBMAlloc.c xkb: Always use MAP_LENGTH keymap size 2025-01-13 11:44:11 +01:00
XKBMisc.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
XKM_file_format.txt Fix spelling/wording issues 2020-07-05 13:07:33 -07:00
ddxBeep.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
ddxCtrls.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
ddxKillSrv.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
ddxLEDs.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
ddxLoad.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
ddxPrivate.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
ddxVT.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
maprules.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
meson.build Add a Meson build system alongside autotools. 2017-04-26 15:25:27 -07:00
xkb-procs.h xkb: rename xkb.h to xkb-procs.h 2022-07-08 14:27:04 +00:00
xkb.c xkb: Fix buffer overflow in _XkbSetCompatMap() 2024-10-29 14:41:59 +01:00
xkbAccessX.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
xkbActions.c dix: unexport non-public functions from dixgrabs.h and document prototypes 2024-10-10 13:50:57 +00:00
xkbDflts.h Use ARRAY_SIZE all over the tree 2017-10-30 13:45:20 -04:00
xkbEvents.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
xkbInit.c xkb: xkbInit: fix char signess mismatch 2024-10-10 13:56:05 +00:00
xkbLEDs.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
xkbPrKeyEv.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
xkbSwap.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
xkbUtils.c xkb: Always use MAP_LENGTH keymap size 2025-01-13 11:44:11 +01:00
xkbfmisc.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
xkbgeom.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
xkbout.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00
xkbsrv_priv.h include: move private defs to dixstruct_priv.h 2024-04-30 00:47:38 +00:00
xkbtext.c xkb: xkbtext: fix char signess mismatch 2024-10-10 13:56:05 +00:00
xkbtext_priv.h xkbtext_priv.h: fix typo in header guard definition 2024-11-10 12:51:10 -08:00
xkmread.c drop obsolete HAVE_DIX_CONFIG_H 2024-10-10 13:38:31 +00:00

The X server uses this directory to store the compiled version of the
current keymap and/or any scratch keymaps used by clients.  The X server
or some other tool might destroy or replace the files in this directory,
so it is not a safe place to store compiled keymaps for long periods of
time.  The default keymap for any server is usually stored in:
     X<num>-default.xkm
where <num> is the display number of the server in question, which makes
it possible for several servers *on the same host* to share the same 
directory.

Unless the X server is modified, sharing this directory between servers on
different hosts could cause problems.