xcb_xkb_set_map assertion error: missing padding in XML protocol description?
When calling xcb_xkb_set_map
with an odd number of elements in the modmap
list, I get an assertion error:
xcb_out.c:271: xcb_send_request_with_fds64: Assertion `(longlen & 3) == 0' failed.
The protocol encoding for the SetMap request in appendix D of the XKB protocol specification says there should be either 0 or 2 bytes of padding between the modmap
and vmodmap
fields, so that vmodmap
is 4-byte aligned. It seems the XML protocol description for the XKB SetMap request is missing this padding (see here; I think there should be a <pad align="4" />
after the </list>
tag).
Here is a minimal example of the bug. (Even if the SetMap request goes through, it fails with an Access error, so executing it should not mess your keymap up.)
#include <xcb/xcb.h>
#include <xcb/xkb.h>
#define NMODS 1 /* Change to 2 to prevent assertion error */
int main(void) {
xcb_connection_t *conn = xcb_connect(0, 0);
xcb_xkb_key_mod_map_t values[NMODS];
for (size_t i = 0; i < NMODS; i++)
values[i] = (xcb_xkb_key_mod_map_t){50, 0x01};
xcb_xkb_set_map(
conn,
XCB_XKB_ID_USE_CORE_KBD,
XCB_XKB_MAP_PART_MODIFIER_MAP,
0, /* flags */
8, 255, /* min and max keycodes */
0, 0, /* types */
0, 0, 0, /* keysyms */
0, 0, 0, /* actions */
0, 0, 0, /* behaviors */
0, 0, 0, /* explicits */
50, 1, NMODS, /* real modifiers */
0, 0, 0, 0, /* virtual modifiers */
values
);
}