Don't leak ActionInfo's 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 38 39 40 41 42 43
diff --git a/src/xkbcomp/compat.c b/src/xkbcomp/compat.c
index cdb0785..b089443 100644
--- a/src/xkbcomp/compat.c
+++ b/src/xkbcomp/compat.c
@@ -135,6 +135,7 @@ static void
ClearCompatInfo(CompatInfo * info, struct xkb_desc * xkb)
{
int i;
+ ActionInfo *next;
free(info->name);
info->name = NULL;
@@ -153,7 +154,11 @@ ClearCompatInfo(CompatInfo * info, struct xkb_desc * xkb)
memset(&info->groupCompat[0], 0,
XkbNumKbdGroups * sizeof(GroupCompatInfo));
info->leds = (LEDInfo *) ClearCommonInfo(&info->leds->defs);
- /* 3/30/94 (ef) -- XXX! Should free action info here */
+ while (info->act) {
+ next = info->act->next;
+ free(info->act);
+ info->act = next;
+ }
ClearVModInfo(&info->vmods, xkb);
}
@@ -426,6 +431,8 @@ HandleIncludeCompatMap(IncludeStmt * stmt,
included.name = stmt->stmt;
stmt->stmt = NULL;
}
+ if (info->act != NULL)
+ included.act = NULL;
FreeXKBFile(rtrn);
}
else
@@ -459,6 +466,8 @@ HandleIncludeCompatMap(IncludeStmt * stmt,
next_incl.act = info->act;
(*hndlr) (rtrn, xkb, MergeOverride, &next_incl);
MergeIncludedCompatMaps(&included, &next_incl, op);
+ if (info->act != NULL)
+ next_incl.act = NULL;
ClearCompatInfo(&next_incl, xkb);
FreeXKBFile(rtrn);
}