blob: 0a6665239801f499c9d6f307e3425811b33290fd [file] [log] [blame]
From 8436c920953f288aea2d6d5f370f8eaaaef82d97 Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net>
Date: Thu, 15 Mar 2012 11:51:41 +1000
Subject: [PATCH] Fix wrong button label and mask copy on OS X
Regression introduced in c1a5a70b51f12dedf354102217c7cd4247ed3a4b.
If double-padding is applied, the length of the mask on the wire may be
smaller than libXi's mask_len. When copying, only the wire length must be
copied, with the remainder set to 0.
When advancing to the button labels, the wire length matters, not libXi's
internal length.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
Tested-by: Jeremy Huddleston <jeremyhu@apple.com>
---
src/XExtInt.c | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/XExtInt.c b/src/XExtInt.c
index 89c0894..0c64f9a 100644
--- a/src/XExtInt.c
+++ b/src/XExtInt.c
@@ -1610,12 +1610,14 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int *nclasses)
int struct_size;
int state_size;
int labels_size;
+ int wire_mask_size;
cls_wire = (xXIButtonInfo*)any_wire;
sizeXIButtonClassType(cls_wire->num_buttons,
&struct_size, &state_size,
&labels_size);
cls_lib = next_block(&ptr_lib, struct_size);
+ wire_mask_size = ((cls_wire->num_buttons + 7)/8 + 3)/4 * 4;
cls_lib->type = cls_wire->type;
cls_lib->sourceid = cls_wire->sourceid;
@@ -1623,10 +1625,14 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int *nclasses)
cls_lib->state.mask_len = state_size;
cls_lib->state.mask = next_block(&ptr_lib, state_size);
memcpy(cls_lib->state.mask, &cls_wire[1],
- cls_lib->state.mask_len);
+ wire_mask_size);
+ if (state_size != wire_mask_size)
+ memset(&cls_lib->state.mask[wire_mask_size], 0,
+ state_size - wire_mask_size);
cls_lib->labels = next_block(&ptr_lib, labels_size);
- atoms =(uint32_t*)((char*)&cls_wire[1] + cls_lib->state.mask_len);
+
+ atoms =(uint32_t*)((char*)&cls_wire[1] + wire_mask_size);
for (j = 0; j < cls_lib->num_buttons; j++)
cls_lib->labels[j] = *atoms++;
--
1.7.7.3