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>
This commit is contained in:
parent
1479f057f3
commit
2d5541d6c3
24
src/3rdparty/xcb/README
vendored
24
src/3rdparty/xcb/README
vendored
@ -20,3 +20,27 @@ The xcb-xinput files where modified to use system includes, see:
|
|||||||
src/3rdparty/xcb/include/xcb/fixup-xinput-h.patch
|
src/3rdparty/xcb/include/xcb/fixup-xinput-h.patch
|
||||||
src/3rdparty/xcb/libxcb/fixup-xinput-c.patch
|
src/3rdparty/xcb/libxcb/fixup-xinput-c.patch
|
||||||
|
|
||||||
|
*****************************************************************
|
||||||
|
|
||||||
|
Additionally, a forwards compatibility bug in libxcb xinput has been addressed
|
||||||
|
by the following patch:
|
||||||
|
|
||||||
|
src/3rdparty/xcb/libxcb/xinput-device-class-sizeof.patch
|
||||||
|
|
||||||
|
The crux of the issue is that 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.
|
||||||
|
|
||||||
|
For more details, see https://gitlab.freedesktop.org/xorg/lib/libxcb/-/merge_requests/20
|
||||||
|
38
src/3rdparty/xcb/libxcb/xinput-device-class-sizeof.patch
vendored
Normal file
38
src/3rdparty/xcb/libxcb/xinput-device-class-sizeof.patch
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
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 *
|
26
src/3rdparty/xcb/libxcb/xinput.c
vendored
26
src/3rdparty/xcb/libxcb/xinput.c
vendored
@ -10535,32 +10535,8 @@ xcb_input_device_class_data_sizeof (const void *_buffer,
|
|||||||
int
|
int
|
||||||
xcb_input_device_class_sizeof (const void *_buffer)
|
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;
|
const xcb_input_device_class_t *_aux = (xcb_input_device_class_t *)_buffer;
|
||||||
unsigned int xcb_buffer_len = 0;
|
return (_aux->len * 4);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
|
Loading…
Reference in New Issue
Block a user