From be9293fe457865a6c760872cfc91191f303fbefb Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Wed, 18 Feb 2015 16:42:39 +0100 Subject: [PATCH] auth-utils: memleak: free the key when we steal data ==5177== 6 (+6) bytes in 1 (+1) blocks are definitely lost in loss record 118 of 6,581 ==5177== at 0x4C29BCF: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==5177== by 0x7F4A6F5: g_malloc (gmem.c:97) ==5177== by 0x7F6301E: g_strdup (gstrfuncs.c:356) ==5177== by 0x4AD902: nm_auth_chain_set_data (nm-auth-utils.c:194) ==5177== by 0x50919E: impl_agent_manager_register_with_capabilities (nm-agent-manager.c:323) ==5177== by 0x62649BE: invoke_object_method (dbus-gobject.c:1899) ==5177== by 0x62649BE: object_registration_message (dbus-gobject.c:2161) ==5177== by 0x649D5CE: _dbus_object_tree_dispatch_and_unlock (dbus-object-tree.c:1018) ==5177== by 0x648F193: dbus_connection_dispatch (dbus-connection.c:4718) ==5177== by 0x6261DB4: message_queue_dispatch (dbus-gmain.c:90) ==5177== by 0x7F44AEA: g_main_dispatch (gmain.c:3111) ==5177== by 0x7F44AEA: g_main_context_dispatch (gmain.c:3710) ==5177== by 0x7F44E87: g_main_context_iterate.isra.29 (gmain.c:3781) ==5177== by 0x7F451B1: g_main_loop_run (gmain.c:3975) (cherry picked from commit da5c332151b61eb8037008b4e4dd9150982b8783) --- src/nm-auth-utils.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/nm-auth-utils.c b/src/nm-auth-utils.c index 9ace162921..b2ca800cad 100644 --- a/src/nm-auth-utils.c +++ b/src/nm-auth-utils.c @@ -158,17 +158,18 @@ nm_auth_chain_steal_data (NMAuthChain *self, const char *tag) { ChainData *tmp; gpointer value = NULL; + void *orig_key; g_return_val_if_fail (self != NULL, NULL); g_return_val_if_fail (tag != NULL, NULL); - tmp = g_hash_table_lookup (self->data, tag); - if (tmp) { + if (g_hash_table_lookup_extended (self->data, tag, &orig_key, (gpointer)&tmp)) { g_hash_table_steal (self->data, tag); value = tmp->data; /* Make sure the destroy handler isn't called when freeing */ tmp->destroy = NULL; free_data (tmp); + g_free (orig_key); } return value; }