[PATCH 3/3] dix: allow for button-only input devices (#21457)

Peter Hutterer peter.hutterer at who-t.net
Tue Dec 7 20:58:49 PST 2010


Add a few checks for the existence of a valuator class on the device to
avoid null-pointer dereferences for button events from devices without a
valuator class.

X.Org Bug 21457 <http://bugs.freedesktop.org/show_bug.cgi?id=21457>

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 dix/getevents.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/dix/getevents.c b/dix/getevents.c
index 9feb216..d2d00a5 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -767,7 +767,7 @@ moveRelative(DeviceIntPtr dev, int *x, int *y, ValuatorMask *mask)
     /* if attached, clip both x and y to the defined limits (usually
      * co-ord space limit). If it is attached, we need x/y to go over the
      * limits to be able to change screens. */
-    if(dev->u.master) {
+    if(dev->u.master && dev->valuator) {
         if (valuator_get_mode(dev, 0) == Absolute)
             clipAxis(dev, 0, x);
         if (valuator_get_mode(dev, 1) == Absolute)
@@ -830,7 +830,7 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
     int old_screenx, old_screeny;
 
     /* scale x&y to screen */
-    if (dev->valuator->numAxes > 0) {
+    if (dev->valuator && dev->valuator->numAxes > 0) {
         *screenx = rescaleValuatorAxis(*x, x_frac, screenx_frac,
                 dev->valuator->axes + 0, NULL, scr->width);
     } else {
@@ -838,7 +838,7 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
         *screenx_frac = dev->last.remainder[0];
     }
 
-    if (dev->valuator->numAxes > 1) {
+    if (dev->valuator && dev->valuator->numAxes > 1) {
         *screeny = rescaleValuatorAxis(*y, y_frac, screeny_frac,
                 dev->valuator->axes + 1, NULL, scr->height);
     } else {
@@ -904,6 +904,9 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
 static void
 updateHistory(DeviceIntPtr dev, ValuatorMask *mask, CARD32 ms)
 {
+    if (!dev->valuator)
+        return;
+
     updateMotionHistory(dev, ms, mask, dev->last.valuators);
     if (dev->u.master)
     {
@@ -1104,7 +1107,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
     if (!pDev->enabled)
         return 0;
 
-    if (!scr || !pDev->valuator)
+    if (!scr)
         return 0;
 
     switch (type)
-- 
1.7.3.3



More information about the xorg-devel mailing list