]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
machined: fix memory corruption
authorLennart Poettering <lennart@poettering.net>
Fri, 7 Dec 2018 15:47:20 +0000 (16:47 +0100)
committerLennart Poettering <lennart@poettering.net>
Sat, 15 Dec 2018 11:10:19 +0000 (12:10 +0100)
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.

src/machine/machined.c

index dec2164bb04eda4f37b56153edf6ab92f984fc73..3ae57182dcc00533f2df15accd095dcd0285ede0 100644 (file)
@@ -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);