dix: protect event generation against single-valuator devices.

If we have a single-axis device and it sends events it should not access
non-existant memory.
This commit is contained in:
Peter Hutterer 2009-05-21 14:11:27 +10:00
parent b25e29e801
commit da0d3baf71

View File

@ -576,6 +576,9 @@ clipAxis(DeviceIntPtr pDev, int axisNum, int *val)
AxisInfoPtr axis = pDev->valuator->axes + axisNum;
/* InitValuatoraAxisStruct ensures that (min < max). */
if (axisNum >= pDev->valuator->numAxes)
return;
/* If a value range is defined, clip. If not, do nothing */
if (axis->max_value <= axis->min_value)
return;
@ -751,8 +754,16 @@ positionSprite(DeviceIntPtr dev, int *x, int *y,
ScreenPtr scr, int *screenx, int *screeny)
{
/* scale x&y to screen */
if (dev->valuator->numAxes > 0)
*screenx = rescaleValuatorAxis(*x, dev->valuator->axes + 0, NULL, scr->width);
else
*screenx = dev->last.valuators[0];
if (dev->valuator->numAxes > 1 )
*screeny = rescaleValuatorAxis(*y, dev->valuator->axes + 1, NULL, scr->height);
else
*screeny = dev->last.valuators[1];
dev->last.valuators[0] = *screenx;
dev->last.valuators[1] = *screeny;
@ -1006,7 +1017,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
CARD32 ms;
DeviceEvent *event;
RawDeviceEvent *raw;
int x, y, /* switches between device and screen coords */
int x = 0, y = 0, /* switches between device and screen coords */
cx, cy; /* only screen coordinates */
ScreenPtr scr = miPointerGetScreen(pDev);
@ -1042,6 +1053,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
valuators[0] = rescaleValuatorAxis(valuators[0], NULL,
pDev->valuator->axes + 0,
scr->width);
if (num_valuators > 1)
valuators[1] = rescaleValuatorAxis(valuators[1], NULL,
pDev->valuator->axes + 1,
scr->height);