xkb: SProcXkbSelectEvents(): simplify swapping

The swapping logic isn't entirely trivial to understand and can be
simplified.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-07-15 16:02:49 +02:00
parent 41ae87912b
commit 67987d9086

View File

@ -67,10 +67,10 @@ SProcXkbSelectEvents(ClientPtr client)
CARD16 *c16; CARD16 *c16;
CARD32 *c32; CARD32 *c32;
} from; } from;
register unsigned bit, ndx, maskLeft, dataLeft, size; register unsigned bit, ndx, maskLeft, dataLeft;
from.c8 = (CARD8 *) &stuff[1]; from.c8 = (CARD8 *) &stuff[1];
dataLeft = (client->req_len * 4) - SIZEOF(xkbSelectEventsReq); dataLeft = (client->req_len * 4) - sizeof(xkbSelectEventsReq);
maskLeft = (stuff->affectWhich & (~XkbMapNotifyMask)); maskLeft = (stuff->affectWhich & (~XkbMapNotifyMask));
for (ndx = 0, bit = 1; (maskLeft != 0); ndx++, bit <<= 1) { for (ndx = 0, bit = 1; (maskLeft != 0); ndx++, bit <<= 1) {
if (((bit & maskLeft) == 0) || (ndx == XkbMapNotify)) if (((bit & maskLeft) == 0) || (ndx == XkbMapNotify))
@ -79,42 +79,43 @@ SProcXkbSelectEvents(ClientPtr client)
if ((stuff->selectAll & bit) || (stuff->clear & bit)) if ((stuff->selectAll & bit) || (stuff->clear & bit))
continue; continue;
switch (ndx) { switch (ndx) {
// CARD16
case XkbNewKeyboardNotify: case XkbNewKeyboardNotify:
case XkbStateNotify: case XkbStateNotify:
case XkbNamesNotify: case XkbNamesNotify:
case XkbAccessXNotify: case XkbAccessXNotify:
case XkbExtensionDeviceNotify: case XkbExtensionDeviceNotify:
size = 2; if (dataLeft < sizeof(CARD16)*2)
return BadLength;
swaps(&from.c16[0]);
swaps(&from.c16[1]);
from.c8 += sizeof(CARD16)*2;
dataLeft -= sizeof(CARD16)*2;
break; break;
// CARD32
case XkbControlsNotify: case XkbControlsNotify:
case XkbIndicatorStateNotify: case XkbIndicatorStateNotify:
case XkbIndicatorMapNotify: case XkbIndicatorMapNotify:
size = 4; if (dataLeft < sizeof(CARD32)*2)
return BadLength;
swapl(&from.c32[0]);
swapl(&from.c32[1]);
from.c8 += sizeof(CARD32)*2;
dataLeft -= sizeof(CARD32)*2;
break; break;
// CARD8
case XkbBellNotify: case XkbBellNotify:
case XkbActionMessage: case XkbActionMessage:
case XkbCompatMapNotify: case XkbCompatMapNotify:
size = 1; if (dataLeft < 2)
return BadLength;
from.c8 += 4;
dataLeft -= 4;
break; break;
default: default:
client->errorValue = _XkbErrCode2(0x1, bit); client->errorValue = _XkbErrCode2(0x1, bit);
return BadValue; return BadValue;
} }
if (dataLeft < (size * 2))
return BadLength;
if (size == 2) {
swaps(&from.c16[0]);
swaps(&from.c16[1]);
}
else if (size == 4) {
swapl(&from.c32[0]);
swapl(&from.c32[1]);
}
else {
size = 2;
}
from.c8 += (size * 2);
dataLeft -= (size * 2);
} }
if (dataLeft > 2) { if (dataLeft > 2) {
ErrorF("[xkb] Extra data (%d bytes) after SelectEvents\n", ErrorF("[xkb] Extra data (%d bytes) after SelectEvents\n",