GPE modifies the valuators array passed in. Which means any driver using e.g. xf86PostButtonEventP(..., valuators) twice to emulate a button click will provide garbage data on the second run.
Constify the argument, and do the same for keyboard and proximity events. Signed-off-by: Peter Hutterer <[email protected]> --- Changes to v1: - valuators array malloc'ed now instead of the previous "int valuators[num_valuators]" dix/getevents.c | 29 +++++++++++++++++++++++++---- hw/xfree86/common/xf86Xinput.c | 8 ++++---- hw/xfree86/common/xf86Xinput.h | 8 ++++---- include/input.h | 6 +++--- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/dix/getevents.c b/dix/getevents.c index a9b6e82..038f640 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -912,11 +912,12 @@ GetKeyboardEvents(EventList *events, DeviceIntPtr pDev, int type, int key_code) int GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type, int key_code, int first_valuator, - int num_valuators, int *valuators) { + int num_valuators, const int *valuators_in) { int num_events = 0; CARD32 ms = 0; DeviceEvent *event; RawDeviceEvent *raw; + int *valuators = NULL; /* refuse events from disabled devices */ if (!pDev->enabled) @@ -947,6 +948,11 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type, events++; num_events++; + valuators = malloc(num_valuators * sizeof(int)); + if (!valuators) + return 0; + memcpy(valuators, valuators_in, num_valuators * sizeof(int)); + init_raw(pDev, raw, ms, type, key_code); set_raw_valuators(raw, first_valuator, num_valuators, valuators, raw->valuators.data_raw); @@ -975,6 +981,7 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type, set_valuators(pDev, event, first_valuator, num_valuators, valuators); + free(valuators); return num_events; } @@ -1067,7 +1074,7 @@ transformAbsolute(DeviceIntPtr dev, int v[MAX_VALUATORS]) int GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, int flags, int first_valuator, int num_valuators, - int *valuators) { + const int *valuators_in) { int num_events = 1; CARD32 ms; DeviceEvent *event; @@ -1076,6 +1083,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, cx, cy; /* only screen coordinates */ float x_frac = 0.0, y_frac = 0.0, cx_frac, cy_frac; ScreenPtr scr = miPointerGetScreen(pDev); + int *valuators = NULL; /* refuse events from disabled devices */ if (!pDev->enabled) @@ -1097,6 +1105,11 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, events++; num_events++; + valuators = malloc(num_valuators * sizeof(int)); + if (!valuators) + return 0; + memcpy(valuators, valuators_in, num_valuators * sizeof(int)); + init_raw(pDev, raw, ms, type, buttons); set_raw_valuators(raw, first_valuator, num_valuators, valuators, raw->valuators.data_raw); @@ -1170,6 +1183,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, set_valuators(pDev, event, first_valuator, num_valuators, valuators); + free(valuators); return num_events; } @@ -1183,10 +1197,11 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, */ int GetProximityEvents(EventList *events, DeviceIntPtr pDev, int type, - int first_valuator, int num_valuators, int *valuators) + int first_valuator, int num_valuators, const int *valuators_in) { int num_events = 1; DeviceEvent *event; + int *valuators = NULL; /* refuse events from disabled devices */ if (!pDev->enabled) @@ -1212,11 +1227,17 @@ GetProximityEvents(EventList *events, DeviceIntPtr pDev, int type, init_event(pDev, event, GetTimeInMillis()); event->type = (type == ProximityIn) ? ET_ProximityIn : ET_ProximityOut; - if (num_valuators) + if (num_valuators) { + valuators = malloc(num_valuators * sizeof(int)); + if (!valuators) + return 0; + memcpy(valuators, valuators_in, num_valuators * sizeof(int)); clipValuators(pDev, first_valuator, num_valuators, valuators); + } set_valuators(pDev, event, first_valuator, num_valuators, valuators); + free(valuators); return num_events; } diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 76d2d00..d140772 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -1004,7 +1004,7 @@ xf86PostMotionEventP(DeviceIntPtr device, int is_absolute, int first_valuator, int num_valuators, - int *valuators) + const int *valuators) { int i = 0, nevents = 0; Bool drag = xf86SendDragEvents(device); @@ -1091,7 +1091,7 @@ xf86PostProximityEventP(DeviceIntPtr device, int is_in, int first_valuator, int num_valuators, - int *valuators) + const int *valuators) { int i, nevents; @@ -1137,7 +1137,7 @@ xf86PostButtonEventP(DeviceIntPtr device, int is_down, int first_valuator, int num_valuators, - int *valuators) + const int *valuators) { int i = 0, nevents = 0; int flags = 0; @@ -1202,7 +1202,7 @@ xf86PostKeyEventP(DeviceIntPtr device, int is_absolute, int first_valuator, int num_valuators, - int *valuators) + const int *valuators) { int i = 0, nevents = 0; diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h index 20a3f1b..d8e69cf 100644 --- a/hw/xfree86/common/xf86Xinput.h +++ b/hw/xfree86/common/xf86Xinput.h @@ -164,23 +164,23 @@ extern _X_EXPORT InputInfoPtr xf86InputDevs; extern _X_EXPORT void xf86PostMotionEvent(DeviceIntPtr device, int is_absolute, int first_valuator, int num_valuators, ...); extern _X_EXPORT void xf86PostMotionEventP(DeviceIntPtr device, int is_absolute, - int first_valuator, int num_valuators, int *valuators); + int first_valuator, int num_valuators, const int *valuators); extern _X_EXPORT void xf86PostProximityEvent(DeviceIntPtr device, int is_in, int first_valuator, int num_valuators, ...); extern _X_EXPORT void xf86PostProximityEventP(DeviceIntPtr device, int is_in, int first_valuator, - int num_valuators, int *valuators); + int num_valuators, const int *valuators); extern _X_EXPORT void xf86PostButtonEvent(DeviceIntPtr device, int is_absolute, int button, int is_down, int first_valuator, int num_valuators, ...); extern _X_EXPORT void xf86PostButtonEventP(DeviceIntPtr device, int is_absolute, int button, int is_down, int first_valuator, int num_valuators, - int *valuators); + const int *valuators); extern _X_EXPORT void xf86PostKeyEvent(DeviceIntPtr device, unsigned int key_code, int is_down, int is_absolute, int first_valuator, int num_valuators, ...); extern _X_EXPORT void xf86PostKeyEventP(DeviceIntPtr device, unsigned int key_code, int is_down, int is_absolute, int first_valuator, int num_valuators, - int *valuators); + const int *valuators); extern _X_EXPORT void xf86PostKeyboardEvent(DeviceIntPtr device, unsigned int key_code, int is_down); extern _X_EXPORT int xf86ActivateDevice(LocalDevicePtr local); diff --git a/include/input.h b/include/input.h index 55b1537..fd7f210 100644 --- a/include/input.h +++ b/include/input.h @@ -447,7 +447,7 @@ extern _X_EXPORT int GetPointerEvents( int flags, int first_valuator, int num_valuators, - int *valuators); + const int *valuators); extern _X_EXPORT int GetKeyboardEvents( EventListPtr events, @@ -462,7 +462,7 @@ extern int GetKeyboardValuatorEvents( int key_code, int first_valuator, int num_valuator, - int *valuators); + const int *valuators); extern int GetProximityEvents( EventListPtr events, @@ -470,7 +470,7 @@ extern int GetProximityEvents( int type, int first_valuator, int num_valuators, - int *valuators); + const int *valuators); extern void PostSyntheticMotion( DeviceIntPtr pDev, -- 1.7.2.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
