From f3176bae97796d84f8018da2f6f3bcb997aa07f2 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Mon, 15 Jul 2024 21:59:02 +0200 Subject: [PATCH] xkb: XkbSendCompatMap(): little cleanup and simplification Make it a bit simpler and easier to read. calloc() and WriteToClient() can handle zero lengths very well. Signed-off-by: Enrico Weigelt, metux IT consult --- xkb/xkb.c | 81 +++++++++++++++++++++++++------------------------------ 1 file changed, 36 insertions(+), 45 deletions(-) diff --git a/xkb/xkb.c b/xkb/xkb.c index 01d8646d9..c845a990d 100644 --- a/xkb/xkb.c +++ b/xkb/xkb.c @@ -2806,52 +2806,45 @@ static int XkbSendCompatMap(ClientPtr client, XkbCompatMapPtr compat, xkbGetCompatMapReply rep) { - char *data; - int size; + int sz = rep.length * sizeof(CARD32); + char *buf = calloc(1, sz); + if (sz && (!buf)) + return BadAlloc; - if (rep.length > 0) { - data = calloc(rep.length, 4); - if (data) { - register unsigned i, bit; - xkbModsWireDesc *grp; - XkbSymInterpretPtr sym = &compat->sym_interpret[rep.firstSI]; - xkbSymInterpretWireDesc *wire = (xkbSymInterpretWireDesc *) data; + if (sz) { + register unsigned i, bit; + xkbModsWireDesc *grp; + XkbSymInterpretPtr sym = &compat->sym_interpret[rep.firstSI]; + xkbSymInterpretWireDesc *wire = (xkbSymInterpretWireDesc *) buf; - size = rep.length * 4; - - for (i = 0; i < rep.nSI; i++, sym++, wire++) { - wire->sym = sym->sym; - wire->mods = sym->mods; - wire->match = sym->match; - wire->virtualMod = sym->virtual_mod; - wire->flags = sym->flags; - memcpy((char *) &wire->act, (char *) &sym->act, - sz_xkbActionWireDesc); - if (client->swapped) { - swapl(&wire->sym); - } - } - if (rep.groups) { - grp = (xkbModsWireDesc *) wire; - for (i = 0, bit = 1; i < XkbNumKbdGroups; i++, bit <<= 1) { - if (rep.groups & bit) { - grp->mask = compat->groups[i].mask; - grp->realMods = compat->groups[i].real_mods; - grp->virtualMods = compat->groups[i].vmods; - if (client->swapped) { - swaps(&grp->virtualMods); - } - grp++; - } - } - wire = (xkbSymInterpretWireDesc *) grp; + for (i = 0; i < rep.nSI; i++, sym++, wire++) { + wire->sym = sym->sym; + wire->mods = sym->mods; + wire->match = sym->match; + wire->virtualMod = sym->virtual_mod; + wire->flags = sym->flags; + memcpy((char *) &wire->act, (char *) &sym->act, + sz_xkbActionWireDesc); + if (client->swapped) { + swapl(&wire->sym); } } - else - return BadAlloc; + if (rep.groups) { + grp = (xkbModsWireDesc *) wire; + for (i = 0, bit = 1; i < XkbNumKbdGroups; i++, bit <<= 1) { + if (rep.groups & bit) { + grp->mask = compat->groups[i].mask; + grp->realMods = compat->groups[i].real_mods; + grp->virtualMods = compat->groups[i].vmods; + if (client->swapped) { + swaps(&grp->virtualMods); + } + grp++; + } + } + wire = (xkbSymInterpretWireDesc *) grp; + } } - else - data = NULL; if (client->swapped) { swaps(&rep.sequenceNumber); @@ -2862,10 +2855,8 @@ XkbSendCompatMap(ClientPtr client, } WriteToClient(client, sizeof(xkbGetCompatMapReply), &rep); - if (data) { - WriteToClient(client, size, data); - free((char *) data); - } + WriteToClient(client, sz, buf); + free(buf); return Success; }