diff options
author | Povilas Kanapickas <povilas@radix.lt> | 2021-09-03 16:23:06 +0300 |
---|---|---|
committer | Povilas Kanapickas <povilas@radix.lt> | 2021-09-20 23:10:26 +0300 |
commit | 2d5541d6c30c67d6a469cba372b6e336a2eeb626 (patch) | |
tree | cbe11b76fc55d44370ccf138d41ca655ec05d3fa /src/3rdparty/xcb/libxcb/xinput.c | |
parent | 1479f057f3861ff9bdbbaee7b1f495512c64efbc (diff) |
3rdparty: Fix forwards-compatibility bug in bundled xinput xcb module
libxcb thinks that it knows about all device class types sent by the X
server XInput extension. With the addition of touchpad gestures in
XInput 2.4 and X server 21.1 this is no longer the case and libxcb fails
horribly by thinking that the protocol was malformed.
The X server currently has a workaround, but it would not address the
following situation:
- there are multiple modules within the same X client (e.g. part of the
application uses Qt, another part talks to X server via another library)
- both of the modules talk to XI
- at least one module requests for XI 2.4 protocol support.
The request for XI 2.4 disables the workaround on the X server and Qt
side would crash horribly.
This bug is being fixed upstream in these MRs:
https://gitlab.freedesktop.org/xorg/proto/xcbproto/-/merge_requests/23
https://gitlab.freedesktop.org/xorg/lib/libxcb/-/merge_requests/20
Change-Id: Idf345271340031152b512ef59f619313be5ec226
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src/3rdparty/xcb/libxcb/xinput.c')
-rw-r--r-- | src/3rdparty/xcb/libxcb/xinput.c | 26 |
1 files changed, 1 insertions, 25 deletions
diff --git a/src/3rdparty/xcb/libxcb/xinput.c b/src/3rdparty/xcb/libxcb/xinput.c index d4e3c250bc..5113213a61 100644 --- a/src/3rdparty/xcb/libxcb/xinput.c +++ b/src/3rdparty/xcb/libxcb/xinput.c @@ -10535,32 +10535,8 @@ xcb_input_device_class_data_sizeof (const void *_buffer, int xcb_input_device_class_sizeof (const void *_buffer) { - char *xcb_tmp = (char *)_buffer; const xcb_input_device_class_t *_aux = (xcb_input_device_class_t *)_buffer; - unsigned int xcb_buffer_len = 0; - unsigned int xcb_block_len = 0; - unsigned int xcb_pad = 0; - unsigned int xcb_align_to = 0; - - - xcb_block_len += sizeof(xcb_input_device_class_t); - xcb_tmp += xcb_block_len; - xcb_buffer_len += xcb_block_len; - xcb_block_len = 0; - /* data */ - xcb_block_len += xcb_input_device_class_data_sizeof(xcb_tmp, _aux->type); - xcb_tmp += xcb_block_len; - xcb_align_to = ALIGNOF(char); - /* insert padding */ - xcb_pad = -xcb_block_len & (xcb_align_to - 1); - xcb_buffer_len += xcb_block_len + xcb_pad; - if (0 != xcb_pad) { - xcb_tmp += xcb_pad; - xcb_pad = 0; - } - xcb_block_len = 0; - - return xcb_buffer_len; + return (_aux->len * 4); } void * |