When we send BadValue back to the client for having invalid mask bits, at least tell them what the (first) invalid bit was.
Signed-off-by: Daniel Stone <[email protected]> --- Xi/xigrabdev.c | 2 +- Xi/xipassivegrab.c | 2 +- Xi/xiselectev.c | 15 +++++++++++++-- include/exevents.h | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c index 24ededc..0adc878 100644 --- a/Xi/xigrabdev.c +++ b/Xi/xigrabdev.c @@ -79,7 +79,7 @@ ProcXIGrabDevice(ClientPtr client) if (!IsMaster(dev)) stuff->paired_device_mode = GrabModeAsync; - if (XICheckInvalidMaskBits((unsigned char*)&stuff[1], + if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1], stuff->mask_len * 4) != Success) return BadValue; diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c index c5f7bf0..972988e 100644 --- a/Xi/xipassivegrab.c +++ b/Xi/xipassivegrab.c @@ -129,7 +129,7 @@ ProcXIPassiveGrabDevice(ClientPtr client) return BadValue; } - if (XICheckInvalidMaskBits((unsigned char*)&stuff[1], + if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1], stuff->mask_len * 4) != Success) return BadValue; diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c index 64ee173..edbd156 100644 --- a/Xi/xiselectev.c +++ b/Xi/xiselectev.c @@ -42,14 +42,19 @@ * * @return BadValue if at least one invalid bit is set or Success otherwise. */ -int XICheckInvalidMaskBits(unsigned char *mask, int len) +int XICheckInvalidMaskBits(ClientPtr client, unsigned char *mask, int len) { if (len >= XIMaskLen(XI2LASTEVENT)) { int i; for (i = XI2LASTEVENT + 1; i < len * 8; i++) + { if (BitIsOn(mask, i)) + { + client->errorValue = i; return BadValue; + } + } } return Success; @@ -126,7 +131,10 @@ ProcXISelectEvents(ClientPtr client) { unsigned char *bits = (unsigned char*)&evmask[1]; if (BitIsOn(bits, XI_HierarchyChanged)) + { + client->errorValue = XI_HierarchyChanged; return BadValue; + } } /* Raw events may only be selected on root windows */ @@ -138,7 +146,10 @@ ProcXISelectEvents(ClientPtr client) BitIsOn(bits, XI_RawButtonPress) || BitIsOn(bits, XI_RawButtonRelease) || BitIsOn(bits, XI_RawMotion)) + { + client->errorValue = XI_RawKeyPress; return BadValue; + } } if (evmask->mask_len >= 1) @@ -182,7 +193,7 @@ ProcXISelectEvents(ClientPtr client) } } - if (XICheckInvalidMaskBits((unsigned char*)&evmask[1], + if (XICheckInvalidMaskBits(client, (unsigned char*)&evmask[1], evmask->mask_len * 4) != Success) return BadValue; diff --git a/include/exevents.h b/include/exevents.h index ae45054..32a3962 100644 --- a/include/exevents.h +++ b/include/exevents.h @@ -327,6 +327,6 @@ XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client, unsigned int len, unsigned char* mask); extern int -XICheckInvalidMaskBits(unsigned char *mask, int len); +XICheckInvalidMaskBits(ClientPtr client, unsigned char *mask, int len); #endif /* EXEVENTS_H */ -- 1.7.2.3 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
