From: Lennart Poettering Date: Fri, 7 Dec 2018 15:47:20 +0000 (+0100) Subject: machined: fix memory corruption X-Git-Tag: v240~44^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5be61bead5e618d51a81e4f5bf3604faff9b0b31;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/machine/machined.c b/src/machine/machined.c index dec2164bb04..3ae57182dcc 100644 --- a/src/machine/machined.c +++ b/src/machine/machined.c @@ -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);