[PATCH] xkb: Do not use base group as an array index.

Peter Hutterer peter.hutterer at who-t.net
Wed Dec 19 17:40:38 PST 2012


On Wed, Dec 19, 2012 at 06:13:21PM +0100, Andreas Wettstein wrote:
> The base group is not brought into range and, therefore, using it as an array
> index crashed the X server.  Also, at this place, we should ignore locked
> groups, but not latched groups.  Therefore, use sum of base and latched groups,
> brought into range.

is there some sort of test-case that triggers this issue reliable?

also, why do we ignore locked groups here? It'd be great to have some
explanation, this is code that hardly anyone knows inside-out, so having
this in the commit message would help a lot.

patch itself looks good though, but I'm lacking context here so I don't know
if there could be any side-effects.

Cheers,
   Peter

> 
> Signed-off-by: Andreas Wettstein <wettstein509 at solnet.ch>
> ---
>  xkb/xkbUtils.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
> index c23cd77..6c6af60 100644
> --- a/xkb/xkbUtils.c
> +++ b/xkb/xkbUtils.c
> @@ -642,6 +642,7 @@ XkbComputeCompatState(XkbSrvInfoPtr xkbi)
>      CARD16 grp_mask;
>      XkbStatePtr state = &xkbi->state;
>      XkbCompatMapPtr map;
> +    XkbControlsPtr ctrls;
>  
>      if (!state || !xkbi->desc || !xkbi->desc->ctrls || !xkbi->desc->compat)
>          return;
> @@ -650,9 +651,14 @@ XkbComputeCompatState(XkbSrvInfoPtr xkbi)
>      grp_mask = map->groups[state->group].mask;
>      state->compat_state = state->mods | grp_mask;
>      state->compat_lookup_mods = state->lookup_mods | grp_mask;
> +    ctrls= xkbi->desc->ctrls;
>  
> -    if (xkbi->desc->ctrls->enabled_ctrls & XkbIgnoreGroupLockMask)
> -        grp_mask = map->groups[state->base_group].mask;
> +    if (ctrls->enabled_ctrls & XkbIgnoreGroupLockMask) {
> +	unsigned char grp = state->base_group+state->latched_group;
> +	if (grp >= ctrls->num_groups)
> +	    grp = XkbAdjustGroup(XkbCharToInt(grp), ctrls);
> +        grp_mask = map->groups[grp].mask;
> +    }
>      state->compat_grab_mods = state->grab_mods | grp_mask;
>      return;
>  }
> -- 
> 1.8.0
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 


More information about the xorg-devel mailing list