dix: allow for button-only input devices (#21457)

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@who-t.net>
Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
Reviewed-by: Daniel Stone <daniel@fooishbar.org>
This commit is contained in:
Peter Hutterer 2010-12-08 14:52:19 +10:00
parent 9cf055892d
commit 0d440a1c6e

View File

@ -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 /* 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 * co-ord space limit). If it is attached, we need x/y to go over the
* limits to be able to change screens. */ * limits to be able to change screens. */
if(dev->u.master) { if(dev->u.master && dev->valuator) {
if (valuator_get_mode(dev, 0) == Absolute) if (valuator_get_mode(dev, 0) == Absolute)
clipAxis(dev, 0, x); clipAxis(dev, 0, x);
if (valuator_get_mode(dev, 1) == Absolute) 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; int old_screenx, old_screeny;
/* scale x&y to screen */ /* scale x&y to screen */
if (dev->valuator->numAxes > 0) { if (dev->valuator && dev->valuator->numAxes > 0) {
*screenx = rescaleValuatorAxis(*x, x_frac, screenx_frac, *screenx = rescaleValuatorAxis(*x, x_frac, screenx_frac,
dev->valuator->axes + 0, NULL, scr->width); dev->valuator->axes + 0, NULL, scr->width);
} else { } else {
@ -838,7 +838,7 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
*screenx_frac = dev->last.remainder[0]; *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, *screeny = rescaleValuatorAxis(*y, y_frac, screeny_frac,
dev->valuator->axes + 1, NULL, scr->height); dev->valuator->axes + 1, NULL, scr->height);
} else { } else {
@ -872,18 +872,21 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
dev->u.master->last.remainder[1] = *screeny_frac; dev->u.master->last.remainder[1] = *screeny_frac;
} }
/* Crossed screen? Scale back to device coordiantes */ if (dev->valuator)
if(*screenx != old_screenx)
{ {
scr = miPointerGetScreen(dev); /* Crossed screen? Scale back to device coordiantes */
*x = rescaleValuatorAxis(*screenx, *screenx_frac, &x_frac, NULL, if(*screenx != old_screenx)
dev->valuator->axes + 0, scr->width); {
} scr = miPointerGetScreen(dev);
if(*screeny != old_screeny) *x = rescaleValuatorAxis(*screenx, *screenx_frac, &x_frac, NULL,
{ dev->valuator->axes + 0, scr->width);
scr = miPointerGetScreen(dev); }
*y = rescaleValuatorAxis(*screeny, *screeny_frac, &y_frac, NULL, if(*screeny != old_screeny)
dev->valuator->axes + 1, scr->height); {
scr = miPointerGetScreen(dev);
*y = rescaleValuatorAxis(*screeny, *screeny_frac, &y_frac, NULL,
dev->valuator->axes + 1, scr->height);
}
} }
/* dropy x/y (device coordinates) back into valuators for next event */ /* dropy x/y (device coordinates) back into valuators for next event */
@ -904,6 +907,9 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
static void static void
updateHistory(DeviceIntPtr dev, ValuatorMask *mask, CARD32 ms) updateHistory(DeviceIntPtr dev, ValuatorMask *mask, CARD32 ms)
{ {
if (!dev->valuator)
return;
updateMotionHistory(dev, ms, mask, dev->last.valuators); updateMotionHistory(dev, ms, mask, dev->last.valuators);
if (dev->u.master) if (dev->u.master)
{ {
@ -1104,7 +1110,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
if (!pDev->enabled) if (!pDev->enabled)
return 0; return 0;
if (!scr || !pDev->valuator) if (!scr)
return 0; return 0;
switch (type) switch (type)