_ostree_kernel_args_replace_take: don't leak when replacing

If !existed, then we add arg to kargs->order, where it will be freed
by that array's free-function. However, if the kernel argument did
already exist, we have to either free arg ourselves (and make sure
the old key is what appears in the hash table), or do a linear search
on kargs->order to replace the old key with the new.

Leak found by valgrind memcheck.

Signed-off-by: Simon McVittie <smcv@debian.org>

Closes: #559
Approved by: cgwalters
This commit is contained in:
Simon McVittie 2016-10-29 21:31:18 +01:00 committed by Atomic Bot
parent a0e7d411c1
commit e757f736e7
1 changed files with 13 additions and 4 deletions

View File

@ -87,12 +87,21 @@ _ostree_kernel_args_replace_take (OstreeKernelArgs *kargs,
gboolean existed;
GPtrArray *values = g_ptr_array_new_with_free_func (g_free);
const char *value = split_keyeq (arg);
gpointer old_key;
existed = g_hash_table_remove (kargs->table, arg);
if (!existed)
g_ptr_array_add (kargs->order, arg);
g_ptr_array_add (values, g_strdup (value));
g_hash_table_replace (kargs->table, arg, values);
existed = g_hash_table_lookup_extended (kargs->table, arg, &old_key, NULL);
if (existed)
{
g_hash_table_replace (kargs->table, old_key, values);
g_free (arg);
}
else
{
g_ptr_array_add (kargs->order, arg);
g_hash_table_replace (kargs->table, arg, values);
}
}
void