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:
parent
23d1bc69f3
commit
dce40e2266
|
@ -122,6 +122,12 @@ ProcXChangeDeviceControl(ClientPtr client)
|
||||||
if (ret != Success)
|
if (ret != Success)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
/* XTest devices are special, none of the below apply to them anyway */
|
||||||
|
if (IsXTestDevice(dev, NULL)) {
|
||||||
|
ret = BadMatch;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
rep = (xChangeDeviceControlReply) {
|
rep = (xChangeDeviceControlReply) {
|
||||||
.repType = X_Reply,
|
.repType = X_Reply,
|
||||||
.RepType = X_ChangeDeviceControl,
|
.RepType = X_ChangeDeviceControl,
|
||||||
|
|
|
@ -110,6 +110,9 @@ ProcXSetDeviceValuators(ClientPtr client)
|
||||||
if (dev->valuator == NULL)
|
if (dev->valuator == NULL)
|
||||||
return BadMatch;
|
return BadMatch;
|
||||||
|
|
||||||
|
if (IsXTestDevice(dev, NULL))
|
||||||
|
return BadMatch;
|
||||||
|
|
||||||
if (stuff->first_valuator + stuff->num_valuators > dev->valuator->numAxes)
|
if (stuff->first_valuator + stuff->num_valuators > dev->valuator->numAxes)
|
||||||
return BadValue;
|
return BadValue;
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,10 @@ ProcXSetDeviceMode(ClientPtr client)
|
||||||
return rc;
|
return rc;
|
||||||
if (dev->valuator == NULL)
|
if (dev->valuator == NULL)
|
||||||
return BadMatch;
|
return BadMatch;
|
||||||
|
|
||||||
|
if (IsXTestDevice(dev, NULL))
|
||||||
|
return BadMatch;
|
||||||
|
|
||||||
if ((dev->deviceGrab.grab) && !SameClient(dev->deviceGrab.grab, client))
|
if ((dev->deviceGrab.grab) && !SameClient(dev->deviceGrab.grab, client))
|
||||||
rep.status = AlreadyGrabbed;
|
rep.status = AlreadyGrabbed;
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue