Xi: always return BadMatch for XTest devices ChangeDeviceControl requests

The only controls that still do something are DEVICE_RESOLUTION and
DEVICE_ENABLE.

XTest devices have no resolution to change, and they cannot be disabled. So
skip the lot, and prevent a crash in the DDX when it's trying to
de-reference pInfo->control_proc on device with no pInfo struct.

Likewise, don't allow setting device mode or the valuators.
XTest pointers are always relative, they don't have a mode.

Test cases:
xts5/XI/ChangeDeviceControl (1/10)
xts5/XI/SetDeviceValuators (1/6)
and a few others

Reported-by: Knut Petersen <Knut_Petersen@t-online.de>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Peter Hutterer 2013-02-26 12:34:21 +10:00
parent 23d1bc69f3
commit dce40e2266
3 changed files with 13 additions and 0 deletions

View File

@ -122,6 +122,12 @@ ProcXChangeDeviceControl(ClientPtr client)
if (ret != Success)
goto out;
/* XTest devices are special, none of the below apply to them anyway */
if (IsXTestDevice(dev, NULL)) {
ret = BadMatch;
goto out;
}
rep = (xChangeDeviceControlReply) {
.repType = X_Reply,
.RepType = X_ChangeDeviceControl,

View File

@ -110,6 +110,9 @@ ProcXSetDeviceValuators(ClientPtr client)
if (dev->valuator == NULL)
return BadMatch;
if (IsXTestDevice(dev, NULL))
return BadMatch;
if (stuff->first_valuator + stuff->num_valuators > dev->valuator->numAxes)
return BadValue;

View File

@ -104,6 +104,10 @@ ProcXSetDeviceMode(ClientPtr client)
return rc;
if (dev->valuator == NULL)
return BadMatch;
if (IsXTestDevice(dev, NULL))
return BadMatch;
if ((dev->deviceGrab.grab) && !SameClient(dev->deviceGrab.grab, client))
rep.status = AlreadyGrabbed;
else