From 240a9a92ae28ee3e794567d3bf00f1d7b365fa0d Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 3 Sep 2014 17:12:32 -0500 Subject: [PATCH] tui: fix requesting and displaying secrets nmt_sync_op_complete_pointer() completes the operation after the caller of this function returns. This means that any values passed to this function must either be allocated from its caller, or referenced by the caller. nm_remote_connection_get_secrets() owns the 'secrets' hash passed to the callback, and it is destroyed when the callback returns. So nmtui's got_secrets() must copy the hash to ensure the data sticks around for nmt_sync_op_wait_pointer() later. --- clients/tui/nmt-editor.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/clients/tui/nmt-editor.c b/clients/tui/nmt-editor.c index f8b4c6d25b..a69b762dec 100644 --- a/clients/tui/nmt-editor.c +++ b/clients/tui/nmt-editor.c @@ -171,7 +171,19 @@ got_secrets (NMRemoteConnection *connection, GError *error, gpointer op) { - nmt_sync_op_complete_pointer (op, secrets, error); + GHashTable *copy = NULL, *setting; + GHashTableIter iter; + const char *name; + + if (secrets) { + /* 'secrets' is owned by the caller so we must copy it */ + copy = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_hash_table_destroy); + g_hash_table_iter_init (&iter, secrets); + while (g_hash_table_iter_next (&iter, (gpointer) &name, (gpointer) &setting)) + g_hash_table_insert (copy, g_strdup (name), nm_utils_gvalue_hash_dup (setting)); + } + + nmt_sync_op_complete_pointer (op, copy, error); } static NMConnection * @@ -196,8 +208,10 @@ build_edit_connection (NMConnection *orig_connection) setting_name, got_secrets, &op); /* FIXME: error handling */ secrets = nmt_sync_op_wait_pointer (&op, NULL); - if (secrets) + if (secrets) { (void) nm_connection_update_secrets (edit_connection, setting_name, secrets, NULL); + g_hash_table_unref (secrets); + } } g_hash_table_unref (settings);