_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:
parent
a0e7d411c1
commit
e757f736e7
|
|
@ -87,12 +87,21 @@ _ostree_kernel_args_replace_take (OstreeKernelArgs *kargs,
|
||||||
gboolean existed;
|
gboolean existed;
|
||||||
GPtrArray *values = g_ptr_array_new_with_free_func (g_free);
|
GPtrArray *values = g_ptr_array_new_with_free_func (g_free);
|
||||||
const char *value = split_keyeq (arg);
|
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_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
|
void
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue