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.
This commit is contained in:
Dan Williams 2014-09-03 17:12:32 -05:00
parent e7f01ae590
commit 240a9a92ae

View file

@ -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);