From 41a7fed3f8a4034ee6b57601d183ced86cbac32b Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Thu, 27 Sep 2012 19:21:26 +0200 Subject: [PATCH] Fix type of keycode in parser and ast For some reason keycodes were listed under mapFlags in the yylval union. Fix it and some sanity checks. Signed-off-by: Ran Benita --- src/xkbcomp/ast-build.c | 2 +- src/xkbcomp/ast-build.h | 2 +- src/xkbcomp/ast.h | 2 +- src/xkbcomp/keycodes.c | 9 ++++++++- src/xkbcomp/parser.y | 3 ++- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/xkbcomp/ast-build.c b/src/xkbcomp/ast-build.c index dcfbb38..4ce4752 100644 --- a/src/xkbcomp/ast-build.c +++ b/src/xkbcomp/ast-build.c @@ -137,7 +137,7 @@ ExprCreateBinary(enum expr_op_type op, ExprDef *left, ExprDef *right) } KeycodeDef * -KeycodeCreate(xkb_atom_t name, unsigned long value) +KeycodeCreate(xkb_atom_t name, int64_t value) { KeycodeDef *def; diff --git a/src/xkbcomp/ast-build.h b/src/xkbcomp/ast-build.h index d433240..b600389 100644 --- a/src/xkbcomp/ast-build.h +++ b/src/xkbcomp/ast-build.h @@ -41,7 +41,7 @@ ExprDef * ExprCreateBinary(enum expr_op_type op, ExprDef *left, ExprDef *right); KeycodeDef * -KeycodeCreate(xkb_atom_t name, unsigned long value); +KeycodeCreate(xkb_atom_t name, int64_t value); KeyAliasDef * KeyAliasCreate(xkb_atom_t alias, xkb_atom_t real); diff --git a/src/xkbcomp/ast.h b/src/xkbcomp/ast.h index 4d8bc83..425e502 100644 --- a/src/xkbcomp/ast.h +++ b/src/xkbcomp/ast.h @@ -211,7 +211,7 @@ typedef struct _KeycodeDef { ParseCommon common; enum merge_mode merge; xkb_atom_t name; - unsigned long value; + int64_t value; } KeycodeDef; typedef struct _KeyAliasDef { diff --git a/src/xkbcomp/keycodes.c b/src/xkbcomp/keycodes.c index f134d85..4273ebe 100644 --- a/src/xkbcomp/keycodes.c +++ b/src/xkbcomp/keycodes.c @@ -461,7 +461,7 @@ HandleIncludeKeycodes(KeyNamesInfo *info, IncludeStmt *stmt) return (info->errorCount == 0); } -static int +static bool HandleKeycodeDef(KeyNamesInfo *info, KeycodeDef *stmt, enum merge_mode merge) { if (stmt->merge != MERGE_DEFAULT) { @@ -471,6 +471,13 @@ HandleKeycodeDef(KeyNamesInfo *info, KeycodeDef *stmt, enum merge_mode merge) merge = stmt->merge; } + if (stmt->value < 0 || stmt->value > XKB_KEYCODE_MAX) { + log_err(info->ctx, + "Illegal keycode %lld: must be between 0..%u; " + "Key ignored\n", stmt->value, XKB_KEYCODE_MAX); + return false; + } + return AddKeyName(info, stmt->value, stmt->name, merge, info->file_id, true); } diff --git a/src/xkbcomp/parser.y b/src/xkbcomp/parser.y index 3f0cc53..781a483 100644 --- a/src/xkbcomp/parser.y +++ b/src/xkbcomp/parser.y @@ -146,11 +146,12 @@ _xkbcommon_error(struct YYLTYPE *loc, struct parser_param *param, const char *ms %type INTEGER FLOAT %type IDENT STRING %type KEYNAME +%type KeyCode %type Number Integer Float SignedNumber %type MergeMode OptMergeMode %type XkbCompositeType FileType %type DoodadType -%type Flag Flags OptFlags KeyCode +%type Flag Flags OptFlags %type MapName OptMapName KeySym %type FieldSpec Ident Element String %type DeclList Decl -- 2.7.4