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]>
---
I guess this is technically an API break but not really...

 dix/getevents.c                |   17 +++++++++++++----
 hw/xfree86/common/xf86Xinput.c |    8 ++++----
 hw/xfree86/common/xf86Xinput.h |    8 ++++----
 include/input.h                |    6 +++---
 4 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/dix/getevents.c b/dix/getevents.c
index a9b6e82..c3b5b2f 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[num_valuators];
 
     /* refuse events from disabled devices */
     if (!pDev->enabled)
@@ -947,6 +948,8 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr 
pDev, int type,
     events++;
     num_events++;
 
+    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);
@@ -1067,7 +1070,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 +1079,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[num_valuators];
 
     /* refuse events from disabled devices */
     if (!pDev->enabled)
@@ -1097,6 +1101,8 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, 
int type, int buttons,
     events++;
     num_events++;
 
+    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);
@@ -1183,10 +1189,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[num_valuators];
 
     /* refuse events from disabled devices */
     if (!pDev->enabled)
@@ -1212,8 +1219,10 @@ 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) {
+        memcpy(valuators, valuators_in, num_valuators * sizeof(int));
         clipValuators(pDev, first_valuator, num_valuators, valuators);
+    }
 
     set_valuators(pDev, event, first_valuator, num_valuators, valuators);
 
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
_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to