vmod: remove support for resolving integer to virtual modifier

This is only relevant to the virtualModifier= statement in interpret
statements in xkb_compat. The current code allows to write e.g.
    virtualModifier = 4
to get the virtual modifier whose index happens to be 4 (possibly
declared in other files or sections, i.e. xkb_types). Doing this is
undeterministic, will break without notice, and not used anywhere.
Don't allow it.

Signed-off-by: Ran Benita <ran234@gmail.com>
master
Ran Benita 2012-08-15 22:07:37 +03:00
parent d3ddcf70e8
commit f410622b4b
2 changed files with 28 additions and 23 deletions

View File

@ -43,6 +43,14 @@ streq(const char *s1, const char *s2)
return strcmp(s1, s2) == 0; return strcmp(s1, s2) == 0;
} }
static inline bool
streq_not_null(const char *s1, const char *s2)
{
if (!s1 || !s2)
return false;
return streq(s1, s2);
}
static inline bool static inline bool
istreq(const char *s1, const char *s2) istreq(const char *s1, const char *s2)
{ {

View File

@ -173,32 +173,29 @@ bool
ResolveVirtualModifier(ExprDef *def, struct xkb_keymap *keymap, ResolveVirtualModifier(ExprDef *def, struct xkb_keymap *keymap,
xkb_mod_index_t *ndx_rtrn, VModInfo *info) xkb_mod_index_t *ndx_rtrn, VModInfo *info)
{ {
int val;
if (def->op == EXPR_IDENT) {
xkb_mod_index_t i; xkb_mod_index_t i;
xkb_mod_mask_t bit; const char *name;
const char *name = xkb_atom_text(keymap->ctx, def->value.str);
for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) { if (def->op != EXPR_IDENT) {
if ((info->available & bit) && keymap->vmod_names[i] && log_err(keymap->ctx,
streq(keymap->vmod_names[i], name)) { "Cannot resolve virtual modifier: "
"found %s where a virtual modifier name was expected\n",
expr_op_type_to_string(def->op));
return false;
}
name = xkb_atom_text(keymap->ctx, def->value.str);
for (i = 0; i < XkbNumVirtualMods; i++) {
if ((info->available & (1 << i)) &&
streq_not_null(keymap->vmod_names[i], name)) {
*ndx_rtrn = i; *ndx_rtrn = i;
return true; return true;
} }
} }
}
if (!ExprResolveInteger(keymap->ctx, def, &val))
return false;
if (val < 0 || val >= XkbNumVirtualMods) {
log_err(keymap->ctx, log_err(keymap->ctx,
"Illegal virtual modifier %d (must be 0..%d inclusive)\n", "Cannot resolve virtual modifier: "
val, XkbNumVirtualMods - 1); "\"%s\" was not previously declared\n", name);
return false; return false;
}
*ndx_rtrn = (xkb_mod_index_t) val;
return true;
} }