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 44 45 46 47 48 49 50 51 52 53 54 55 56
|
From: Gaƫl Le Mignot
Subject: Fixed memory leak in librecode
Bug-Debian: https://bugs.debian.org/242190
X-Debian-version: 3.6-16
--- a/src/names.c
+++ b/src/names.c
@@ -101,6 +101,21 @@
return strcmp (first->name, second->name) == 0;
}
+static void
+alias_freer (void *param)
+{
+ RECODE_ALIAS alias = param;
+ struct recode_surface_list *next = alias->implied_surfaces;
+ struct recode_surface_list *p;
+ while (next)
+ {
+ p = next->next;
+ free(next);
+ next = p;
+ }
+ free(alias);
+}
+
bool
prepare_for_aliases (RECODE_OUTER outer)
{
@@ -108,7 +123,7 @@
outer->number_of_symbols = 0;
outer->alias_table
- = hash_initialize (800, NULL, alias_hasher, alias_comparator, free);
+ = hash_initialize (800, NULL, alias_hasher, alias_comparator, alias_freer);
if (!outer->alias_table)
return false;
--- a/src/outer.c
+++ b/src/outer.c
@@ -617,7 +617,14 @@
if (outer->alias_table)
hash_free (outer->alias_table);
if (outer->argmatch_charset_array)
- free (outer->argmatch_charset_array);
+ {
+ char **cursor;
+ for (cursor = outer->argmatch_charset_array; *cursor; cursor++)
+ free (*cursor);
+ for (cursor = outer->argmatch_surface_array; *cursor; cursor++)
+ free (*cursor);
+ free (outer->argmatch_charset_array);
+ }
if (outer->one_to_same)
free ((void *) outer->one_to_same);
free (outer);
|