diff --git a/src/xkbcomp/types.c b/src/xkbcomp/types.c index c61787ba4..7cdbe9047 100644 --- a/src/xkbcomp/types.c +++ b/src/xkbcomp/types.c @@ -118,6 +118,9 @@ static void ClearKeyTypesInfo(KeyTypesInfo *info) { free(info->name); + KeyTypeInfo *type; + darray_foreach(type, info->types) + ClearKeyTypeInfo(type); darray_free(info->types); } @@ -180,11 +183,6 @@ MergeIncludedKeyTypes(KeyTypesInfo *into, KeyTypesInfo *from, { if (from->errorCount > 0) { into->errorCount += from->errorCount; - // Free unused types - KeyTypeInfo *type; - darray_foreach(type, from->types) { - ClearKeyTypeInfo(type); - } return; } @@ -197,6 +195,7 @@ MergeIncludedKeyTypes(KeyTypesInfo *into, KeyTypesInfo *from, if (darray_empty(into->types)) { into->types = from->types; + /* Types stealen via shallow copy, so reinitialze the array */ darray_init(from->types); } else { @@ -206,6 +205,9 @@ MergeIncludedKeyTypes(KeyTypesInfo *into, KeyTypesInfo *from, if (!AddKeyType(into, type, false)) into->errorCount++; } + /* Types were either shallow copied or reinitialized individually + in `AddKeyType`, so we only need to free the array */ + darray_free(from->types); } } @@ -635,16 +637,16 @@ HandleKeyTypeDef(KeyTypesInfo *info, KeyTypeDef *def, enum merge_mode merge) .level_names = darray_new(), }; - if (!HandleKeyTypeBody(info, def->body, &type)) { - info->errorCount++; - return false; - } - - if (!AddKeyType(info, &type, true)) { + if (!HandleKeyTypeBody(info, def->body, &type) || + !AddKeyType(info, &type, true)) + { info->errorCount++; + ClearKeyTypeInfo(&type); return false; } + /* Type has been either stolen via shallow copy or reinitialized in + `AddKeyType`: no need to free the arrays */ return true; }