From ca21a266224b6eff4fd817c2082d2e144f1ea58c Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 11 Oct 2010 15:38:38 +1000 Subject: xkb: init mapWidth and symsPerKey arrays to 0. Helps debugging greatly, random 8 or 16 bit values can sometimes look like valid values, causing much excitement on the client front. Signed-off-by: Peter Hutterer Reviewed-by: Daniel Stone --- xkb/xkb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'xkb/xkb.c') diff --git a/xkb/xkb.c b/xkb/xkb.c index 4105c1c6b..7d95bc0e3 100644 --- a/xkb/xkb.c +++ b/xkb/xkb.c @@ -2343,8 +2343,8 @@ _XkbSetMapChecks(ClientPtr client, DeviceIntPtr dev, xkbSetMapReq *req, char* va XkbDescPtr xkb; int error; int nTypes = 0, nActions; - CARD8 mapWidths[XkbMaxLegalKeyCode + 1]; - CARD16 symsPerKey[XkbMaxLegalKeyCode + 1]; + CARD8 mapWidths[XkbMaxLegalKeyCode + 1] = {0}; + CARD16 symsPerKey[XkbMaxLegalKeyCode + 1] = {0}; xkbi= dev->key->xkbInfo; xkb = xkbi->desc; -- cgit v1.2.3 From 649293f6b634e6305b6737a841d6e9d0f0065d6c Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 11 Oct 2010 16:09:18 +1000 Subject: 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 Signed-off-by: Peter Hutterer Reviewed-by: Daniel Stone --- xkb/xkb.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) (limited to 'xkb/xkb.c') diff --git a/xkb/xkb.c b/xkb/xkb.c index 7d95bc0e3..bbb1d9df8 100644 --- a/xkb/xkb.c +++ b/xkb/xkb.c @@ -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;gkt_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;inKeySyms;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;imax_key_code;i++,map++) { + register int g,ng,w; + ng= XkbNumGroups(map->group_info); + for (w=g=0;gkt_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))) { -- cgit v1.2.3