machined: fix memory corruption
Let's make sure the first hashmap we destroy also frees all machines, because otherwise when freeing the other hashmaps we'll try to deregister the contained machines from the hashmaps already destroyed.
This commit is contained in:
parent
f079c3727c
commit
5be61bead5
|
@ -25,8 +25,7 @@
|
|||
static Manager* manager_unref(Manager *m);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_unref);
|
||||
|
||||
DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(machine_hash_ops, void, trivial_hash_func, trivial_compare_func,
|
||||
Machine, machine_free);
|
||||
DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(machine_hash_ops, char, string_hash_func, string_compare_func, Machine, machine_free);
|
||||
|
||||
static int manager_new(Manager **ret) {
|
||||
_cleanup_(manager_unrefp) Manager *m = NULL;
|
||||
|
@ -38,9 +37,9 @@ static int manager_new(Manager **ret) {
|
|||
if (!m)
|
||||
return -ENOMEM;
|
||||
|
||||
m->machines = hashmap_new(&string_hash_ops);
|
||||
m->machines = hashmap_new(&machine_hash_ops);
|
||||
m->machine_units = hashmap_new(&string_hash_ops);
|
||||
m->machine_leaders = hashmap_new(&machine_hash_ops);
|
||||
m->machine_leaders = hashmap_new(NULL);
|
||||
|
||||
if (!m->machines || !m->machine_units || !m->machine_leaders)
|
||||
return -ENOMEM;
|
||||
|
@ -72,7 +71,7 @@ static Manager* manager_unref(Manager *m) {
|
|||
|
||||
assert(m->n_operations == 0);
|
||||
|
||||
hashmap_free(m->machines);
|
||||
hashmap_free(m->machines); /* This will free all machines, so that the machine_units/machine_leaders is empty */
|
||||
hashmap_free(m->machine_units);
|
||||
hashmap_free(m->machine_leaders);
|
||||
hashmap_free(m->image_cache);
|
||||
|
|
Loading…
Reference in a new issue