diff --git a/WHATS_NEW b/WHATS_NEW index 29678f494..2fece12b3 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.173 - ================================= + Fix memory leak in lvmetad when working with duplicates. Accept 'lvm -h' and 'lvm --help' as well as 'lvm help' for help. Suppress error message from accept() on clean lvmetad shutdown. Tidy clvmd client list processing and fix segfaults. diff --git a/daemons/lvmetad/lvmetad-core.c b/daemons/lvmetad/lvmetad-core.c index af5d42977..8910bd493 100644 --- a/daemons/lvmetad/lvmetad-core.c +++ b/daemons/lvmetad/lvmetad-core.c @@ -258,6 +258,21 @@ static void destroy_metadata_hashes(lvmetad_state *s) dm_hash_iterate(n, s->pvid_to_pvmeta) dm_config_destroy(dm_hash_get_data(s->pvid_to_pvmeta, n)); + dm_hash_iterate(n, s->vgid_to_vgname) + dm_free(dm_hash_get_data(s->vgid_to_vgname, n)); + + dm_hash_iterate(n, s->vgname_to_vgid) + dm_free(dm_hash_get_data(s->vgname_to_vgid, n)); + + dm_hash_iterate(n, s->vgid_to_info) + dm_free(dm_hash_get_data(s->vgid_to_info, n)); + + dm_hash_iterate(n, s->device_to_pvid) + dm_free(dm_hash_get_data(s->device_to_pvid, n)); + + dm_hash_iterate(n, s->pvid_to_vgid) + dm_free(dm_hash_get_data(s->pvid_to_vgid, n)); + dm_hash_destroy(s->pvid_to_pvmeta); dm_hash_destroy(s->vgid_to_metadata); dm_hash_destroy(s->vgid_to_vgname); @@ -2111,6 +2126,8 @@ static response pv_found(lvmetad_state *s, request r) DEBUGLOG(s, "pv_found ignore duplicate device %" PRIu64 " of existing PV for pvid %s", arg_device, arg_pvid); dm_config_destroy(new_pvmeta); + /* device_to_pvid no longer references prev_pvid_lookup */ + dm_free((void*)prev_pvid_on_dev); s->flags |= GLFL_DISABLE; s->flags |= GLFL_DISABLE_REASON_DUPLICATES; return reply_fail("Ignore duplicate PV");