diff --git a/dix/devices.c b/dix/devices.c index 52654e06e..3be0a1b4e 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -1973,27 +1973,36 @@ ProcGetKeyboardMapping(ClientPtr client) if (!syms) return BadAlloc; + const int count = syms->mapWidth * stuff->count; + const int size = count * sizeof(KeySym); + void *payload = calloc(count, sizeof(KeySym)); + if (!payload) + return BadAlloc; + + memcpy(payload, + &syms->map[syms->mapWidth * (stuff->firstKeyCode - syms->minKeyCode)], + size); + xGetKeyboardMappingReply rep = { .type = X_Reply, .keySymsPerKeyCode = syms->mapWidth, .sequenceNumber = client->sequence, /* length is a count of 4 byte quantities and KeySyms are 4 bytes */ - .length = syms->mapWidth * stuff->count + .length = count }; if (client->swapped) { swaps(&rep.sequenceNumber); swapl(&rep.length); + SwapLongs(payload, count); } WriteToClient(client, sizeof(rep), &rep); - client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write; - WriteSwappedDataToClient(client, - syms->mapWidth * stuff->count * sizeof(KeySym), - &syms->map[syms->mapWidth * (stuff->firstKeyCode - - syms->minKeyCode)]); + WriteToClient(client, size, payload); + free(syms->map); free(syms); + free(payload); return Success; } @@ -2255,18 +2264,16 @@ ProcChangeKeyboardControl(ClientPtr client) int ProcGetKeyboardControl(ClientPtr client) { - int rc, i; DeviceIntPtr kbd = PickKeyboard(client); KeybdCtrl *ctrl = &kbd->kbdfeed->ctrl; - xGetKeyboardControlReply rep; REQUEST_SIZE_MATCH(xReq); - rc = XaceHookDeviceAccess(client, kbd, DixGetAttrAccess); + int rc = XaceHookDeviceAccess(client, kbd, DixGetAttrAccess); if (rc != Success) return rc; - rep = (xGetKeyboardControlReply) { + xGetKeyboardControlReply rep = { .type = X_Reply, .globalAutoRepeat = ctrl->autoRepeat, .sequenceNumber = client->sequence, @@ -2277,9 +2284,17 @@ ProcGetKeyboardControl(ClientPtr client) .bellPitch = ctrl->bell_pitch, .bellDuration = ctrl->bell_duration }; - for (i = 0; i < 32; i++) + for (int i = 0; i < 32; i++) rep.map[i] = ctrl->autoRepeats[i]; - WriteReplyToClient(client, sizeof(xGetKeyboardControlReply), &rep); + + if (client->swapped) { + swaps(&rep.sequenceNumber); + swapl(&rep.length); + swapl(&rep.ledMask); + swaps(&rep.bellPitch); + swaps(&rep.bellDuration); + } + WriteToClient(client, sizeof(rep), &rep); return Success; } diff --git a/dix/swaprep.c b/dix/swaprep.c index 3e597a0b3..a12c77126 100644 --- a/dix/swaprep.c +++ b/dix/swaprep.c @@ -535,18 +535,6 @@ SListExtensionsReply(ClientPtr pClient, int size, xListExtensionsReply * pRep) WriteToClient(pClient, size, pRep); } -void _X_COLD -SGetKeyboardControlReply(ClientPtr pClient, int size, - xGetKeyboardControlReply * pRep) -{ - swaps(&pRep->sequenceNumber); - swapl(&pRep->length); - swapl(&pRep->ledMask); - swaps(&pRep->bellPitch); - swaps(&pRep->bellDuration); - WriteToClient(pClient, size, pRep); -} - void _X_COLD SGetPointerControlReply(ClientPtr pClient, int size, xGetPointerControlReply * pRep) diff --git a/dix/tables.c b/dix/tables.c index f0f754371..2ee5f5c19 100644 --- a/dix/tables.c +++ b/dix/tables.c @@ -818,7 +818,7 @@ ReplySwapPtr ReplySwapVector[256] = { ReplyNotSwappd, /* 100 */ ReplyNotSwappd, ReplyNotSwappd, - (ReplySwapPtr) SGetKeyboardControlReply, + ReplyNotSwappd, ReplyNotSwappd, ReplyNotSwappd, /* 105 */ (ReplySwapPtr) SGetPointerControlReply, diff --git a/include/swaprep.h b/include/swaprep.h index d53547751..692a80b91 100644 --- a/include/swaprep.h +++ b/include/swaprep.h @@ -154,11 +154,6 @@ extern void SListExtensionsReply(ClientPtr /* pClient */ , int /* size */ , xListExtensionsReply * /* pRep */ ); -extern void SGetKeyboardControlReply(ClientPtr /* pClient */ , - int /* size */ , - xGetKeyboardControlReply * - /* pRep */ ); - extern void SGetPointerControlReply(ClientPtr /* pClient */ , int /* size */ , xGetPointerControlReply *