From e5fdbcbb9943e9fe0952bfe8da1c304d0d5a8c6f Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Sun, 2 Sep 2012 11:49:43 +0300 Subject: [PATCH] compat: disallow changing global defaults from within an interpret It's currently possible to write something like this: interpret Num_Lock+Any { virtualModifier = NumLock; action = LockMods(modifiers=NumLock); !indicator.allowExplicit; }; The final statement has the same effect as writing it in the global file scope, which changes the default indicator (which all subsequent indicators start off as). This very strange and also unused; if someone does it he probably expects it to affect only the local scope, and he might then get unexpected behavior. So don't allow it. Also, HandleInterpVar is clearly a misnomer (as it can also change indicator defaults) so rename it. Signed-off-by: Ran Benita --- src/xkbcomp/compat.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/xkbcomp/compat.c b/src/xkbcomp/compat.c index a83b6c2..31326b0 100644 --- a/src/xkbcomp/compat.c +++ b/src/xkbcomp/compat.c @@ -804,7 +804,7 @@ SetIndicatorMapField(CompatInfo *info, LEDInfo *led, } static bool -HandleInterpVar(CompatInfo *info, VarDef *stmt) +HandleGlobalVar(CompatInfo *info, VarDef *stmt) { const char *elem, *field; ExprDef *ndx; @@ -832,7 +832,10 @@ HandleInterpBody(CompatInfo *info, VarDef *def, SymInterpInfo *si) for (; def; def = (VarDef *) def->common.next) { if (def->name && def->name->op == EXPR_FIELD_REF) { - ok = HandleInterpVar(info, def); + log_err(info->keymap->ctx, + "Cannot set a global default value from within an interpret statement; " + "Move statements to the global file scope\n"); + ok = false; continue; } @@ -961,7 +964,7 @@ HandleCompatMapFile(CompatInfo *info, XkbFile *file, enum merge_mode merge) ok = HandleIndicatorMapDef(info, (IndicatorMapDef *) stmt, merge); break; case STMT_VAR: - ok = HandleInterpVar(info, (VarDef *) stmt); + ok = HandleGlobalVar(info, (VarDef *) stmt); break; case STMT_VMOD: ok = HandleVModDef((VModDef *) stmt, info->keymap, merge,