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:
parent
b25e29e801
commit
da0d3baf71
|
@ -576,6 +576,9 @@ clipAxis(DeviceIntPtr pDev, int axisNum, int *val)
|
||||||
AxisInfoPtr axis = pDev->valuator->axes + axisNum;
|
AxisInfoPtr axis = pDev->valuator->axes + axisNum;
|
||||||
/* InitValuatoraAxisStruct ensures that (min < max). */
|
/* InitValuatoraAxisStruct ensures that (min < max). */
|
||||||
|
|
||||||
|
if (axisNum >= pDev->valuator->numAxes)
|
||||||
|
return;
|
||||||
|
|
||||||
/* If a value range is defined, clip. If not, do nothing */
|
/* If a value range is defined, clip. If not, do nothing */
|
||||||
if (axis->max_value <= axis->min_value)
|
if (axis->max_value <= axis->min_value)
|
||||||
return;
|
return;
|
||||||
|
@ -751,8 +754,16 @@ positionSprite(DeviceIntPtr dev, int *x, int *y,
|
||||||
ScreenPtr scr, int *screenx, int *screeny)
|
ScreenPtr scr, int *screenx, int *screeny)
|
||||||
{
|
{
|
||||||
/* scale x&y to screen */
|
/* scale x&y to screen */
|
||||||
*screenx = rescaleValuatorAxis(*x, dev->valuator->axes + 0, NULL, scr->width);
|
if (dev->valuator->numAxes > 0)
|
||||||
*screeny = rescaleValuatorAxis(*y, dev->valuator->axes + 1, NULL, scr->height);
|
*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[0] = *screenx;
|
||||||
dev->last.valuators[1] = *screeny;
|
dev->last.valuators[1] = *screeny;
|
||||||
|
|
||||||
|
@ -1006,7 +1017,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
|
||||||
CARD32 ms;
|
CARD32 ms;
|
||||||
DeviceEvent *event;
|
DeviceEvent *event;
|
||||||
RawDeviceEvent *raw;
|
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 */
|
cx, cy; /* only screen coordinates */
|
||||||
ScreenPtr scr = miPointerGetScreen(pDev);
|
ScreenPtr scr = miPointerGetScreen(pDev);
|
||||||
|
|
||||||
|
@ -1040,11 +1051,12 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
|
||||||
{
|
{
|
||||||
|
|
||||||
valuators[0] = rescaleValuatorAxis(valuators[0], NULL,
|
valuators[0] = rescaleValuatorAxis(valuators[0], NULL,
|
||||||
pDev->valuator->axes + 0,
|
pDev->valuator->axes + 0,
|
||||||
scr->width);
|
scr->width);
|
||||||
valuators[1] = rescaleValuatorAxis(valuators[1], NULL,
|
if (num_valuators > 1)
|
||||||
pDev->valuator->axes + 1,
|
valuators[1] = rescaleValuatorAxis(valuators[1], NULL,
|
||||||
scr->height);
|
pDev->valuator->axes + 1,
|
||||||
|
scr->height);
|
||||||
}
|
}
|
||||||
|
|
||||||
moveAbsolute(pDev, &x, &y, first_valuator, num_valuators, valuators);
|
moveAbsolute(pDev, &x, &y, first_valuator, num_valuators, valuators);
|
||||||
|
@ -1055,7 +1067,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
|
||||||
}
|
}
|
||||||
|
|
||||||
set_raw_valuators(raw, first_valuator, num_valuators, valuators,
|
set_raw_valuators(raw, first_valuator, num_valuators, valuators,
|
||||||
raw->valuators.data);
|
raw->valuators.data);
|
||||||
|
|
||||||
positionSprite(pDev, &x, &y, scr, &cx, &cy);
|
positionSprite(pDev, &x, &y, scr, &cx, &cy);
|
||||||
updateHistory(pDev, first_valuator, num_valuators, ms);
|
updateHistory(pDev, first_valuator, num_valuators, ms);
|
||||||
|
|
Loading…
Reference in New Issue