ast-build: make sure InterpDef is freeable With the following two rules: InterpretDecl : INTERPRET InterpretMatch OBRACE VarDeclList CBRACE SEMI { $2->def = $4; $$ = $2; } ; InterpretMatch : KeySym PLUS Expr { $$ = InterpCreate($1, $3); } | KeySym { $$ = InterpCreate($1, NULL); } ; And the fact that InterpCreate doesn't initialize ->def, if the VarDeclList fails, the %destructor tries to recursively free the uninitialized ->def VarDef. So always initialize it. That was the only problematic code in the parser for %destructor (I'm pretty sure). Signed-off-by: Ran Benita <ran234@gmail.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
diff --git a/src/xkbcomp/ast-build.c b/src/xkbcomp/ast-build.c
index 4ce1cc4..58c482c 100644
--- a/src/xkbcomp/ast-build.c
+++ b/src/xkbcomp/ast-build.c
@@ -325,6 +325,7 @@ InterpCreate(xkb_keysym_t sym, ExprDef *match)
def->common.next = NULL;
def->sym = sym;
def->match = match;
+ def->def = NULL;
return def;
}
diff --git a/test/data/keymaps/syntax-error2.xkb b/test/data/keymaps/syntax-error2.xkb
new file mode 100644
index 0000000..0ca28f2
--- /dev/null
+++ b/test/data/keymaps/syntax-error2.xkb
@@ -0,0 +1,7 @@
+xkb_keymap {
+xkb_compatibility "complete" {
+ interpret ISO_Level2_Latch+Exactly(Shift) {
+ action == LatchMods(modifiers=Shift,clearLocks,latchToLock);
+ };
+};
+};
diff --git a/test/filecomp.c b/test/filecomp.c
index 5f083ee..ced2472 100644
--- a/test/filecomp.c
+++ b/test/filecomp.c
@@ -48,6 +48,7 @@ main(void)
assert(!test_file(ctx, "keymaps/divide-by-zero.xkb"));
assert(!test_file(ctx, "keymaps/bad.xkb"));
assert(!test_file(ctx, "keymaps/syntax-error.xkb"));
+ assert(!test_file(ctx, "keymaps/syntax-error2.xkb"));
assert(!test_file(ctx, "does not exist"));
/* Test response to invalid flags and formats. */