diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2012-02-22 15:32:56 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2012-02-27 13:01:45 +1000 |
commit | 2416ee4a015068359807a10f433e8c54192c78a9 (patch) | |
tree | 4de513de8808b6c9c8b255b802b25493d8f82ec2 /dix | |
parent | 38000e7d1f958f5944e641de3e716944a5876d41 (diff) |
dix: avoid NULL-pointer dereference on button-only devices (#38313)
And for such devices simply take the last.valuators[] which must be valid at
all times anyway. UpdateSlaveDeviceCoords takes care of that.
X.Org Bug 38313 <http://bugs.freedesktop.org/show_bug.cgi?id=38313>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
Diffstat (limited to 'dix')
-rw-r--r-- | dix/getevents.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/dix/getevents.c b/dix/getevents.c index 6ea4ba010..306d0ff09 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -840,10 +840,15 @@ scale_to_desktop(DeviceIntPtr dev, ValuatorMask *mask, ScreenPtr scr = miPointerGetScreen(dev); double x, y; - BUG_WARN(!dev->valuator); - BUG_WARN(dev->valuator->numAxes < 2); + BUG_WARN(!dev->valuator || dev->valuator->numAxes < 2); if (!dev->valuator || dev->valuator->numAxes < 2) + { + /* if we have no axes, last.valuators must be in screen coords + * anyway */ + *devx = *screenx = dev->last.valuators[0]; + *devy = *screeny = dev->last.valuators[1]; return scr; + } if (valuator_mask_isset(mask, 0)) x = valuator_mask_get_double(mask, 0); @@ -1493,8 +1498,6 @@ GetPointerEvents(InternalEvent *events, DeviceIntPtr pDev, int type, { CARD32 ms = GetTimeInMillis(); int num_events = 0, nev_tmp; - int h_scroll_axis = pDev->valuator->h_scroll_axis; - int v_scroll_axis = pDev->valuator->v_scroll_axis; ValuatorMask mask; ValuatorMask scroll; int i; @@ -1519,6 +1522,14 @@ GetPointerEvents(InternalEvent *events, DeviceIntPtr pDev, int type, { double val, adj; int axis; + int h_scroll_axis = -1; + int v_scroll_axis = -1; + + if (pDev->valuator) + { + h_scroll_axis = pDev->valuator->h_scroll_axis; + v_scroll_axis = pDev->valuator->v_scroll_axis; + } /* Up is negative on valuators, down positive */ switch (buttons) { |