From 8db0319198a9e65e16ef94d8b44801eef5322dd9 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 30 Jan 2019 07:57:28 +0100 Subject: [PATCH] libnm/lldp: fix leak and bug in nm_lldp_neighbor_dup() For one, just reassigning copy->attrs leaks the previous hash table. Fix that. Also, NMLldpNeighbor instances are not immutable. I think that is an uglyness, and it would be preferable that they can be sealed. A sealed object could safely share/ref the internal hash-table. However, as it is, we cannot just have two NMLldpNeighbor instances share the same hash-table. Do a full copy. --- libnm/nm-device.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libnm/nm-device.c b/libnm/nm-device.c index a09ecb5cbb..9b19673d3d 100644 --- a/libnm/nm-device.c +++ b/libnm/nm-device.c @@ -2675,9 +2675,15 @@ static NMLldpNeighbor * nm_lldp_neighbor_dup (NMLldpNeighbor *neighbor) { NMLldpNeighbor *copy; + GHashTableIter iter; + const char *key; + GVariant *value; copy = nm_lldp_neighbor_new (); - copy->attrs = g_hash_table_ref (neighbor->attrs); + + g_hash_table_iter_init (&iter, neighbor->attrs); + while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &value)) + g_hash_table_insert (copy->attrs, g_strdup (key), g_variant_ref (value)); return copy; }