Commit 649293f6 authored by Peter Hutterer's avatar Peter Hutterer

xkb: always fill the symsPerKey array, regardless of client flags (#30527)

Even if a client does not modify the symbols, symsPerKey and mapWidths must
be filled from the current configuration. Both arrays are then passed into
other functions (pending the right flag), thus they must contain valid
values regardless of the XkbKeySymsMask flag in req->present.

X.Org Bug 30527 <http://bugs.freedesktop.org/show_bug.cgi?id=30527>
Signed-off-by: 's avatarPeter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: 's avatarDaniel Stone <daniel@fooishbar.org>
parent ca21a266
......@@ -1677,20 +1677,6 @@ xkbSymMapWireDesc* wire = *wireRtrn;
if (!(XkbKeySymsMask&req->present))
return 1;
CHK_REQ_KEY_RANGE2(0x11,req->firstKeySym,req->nKeySyms,req,(*errorRtrn),0);
map = &xkb->map->key_sym_map[xkb->min_key_code];
for (i=xkb->min_key_code;i<(unsigned)req->firstKeySym;i++,map++) {
register int g,ng,w;
ng= XkbNumGroups(map->group_info);
for (w=g=0;g<ng;g++) {
if (map->kt_index[g]>=(unsigned)nTypes) {
*errorRtrn = _XkbErrCode4(0x13,i,g,map->kt_index[g]);
return 0;
}
if (mapWidths[map->kt_index[g]]>w)
w= mapWidths[map->kt_index[g]];
}
symsPerKey[i] = w*ng;
}
for (i=0;i<req->nKeySyms;i++) {
KeySym *pSyms;
register unsigned nG;
......@@ -2345,6 +2331,8 @@ _XkbSetMapChecks(ClientPtr client, DeviceIntPtr dev, xkbSetMapReq *req, char* va
int nTypes = 0, nActions;
CARD8 mapWidths[XkbMaxLegalKeyCode + 1] = {0};
CARD16 symsPerKey[XkbMaxLegalKeyCode + 1] = {0};
XkbSymMapPtr map;
int i;
xkbi= dev->key->xkbInfo;
xkb = xkbi->desc;
......@@ -2373,6 +2361,23 @@ _XkbSetMapChecks(ClientPtr client, DeviceIntPtr dev, xkbSetMapReq *req, char* va
client->errorValue = nTypes;
return BadValue;
}
/* symsPerKey/mapWidths must be filled regardless of client-side flags */
map = &xkb->map->key_sym_map[xkb->min_key_code];
for (i=xkb->min_key_code;i<xkb->max_key_code;i++,map++) {
register int g,ng,w;
ng= XkbNumGroups(map->group_info);
for (w=g=0;g<ng;g++) {
if (map->kt_index[g]>=(unsigned)nTypes) {
client->errorValue = _XkbErrCode4(0x13,i,g,map->kt_index[g]);
return 0;
}
if (mapWidths[map->kt_index[g]]>w)
w= mapWidths[map->kt_index[g]];
}
symsPerKey[i] = w*ng;
}
if ((req->present & XkbKeySymsMask) &&
(!CheckKeySyms(client,xkb,req,nTypes,mapWidths,symsPerKey,
(xkbSymMapWireDesc **)&values,&error))) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment