summaryrefslogtreecommitdiff
path: root/libnm-core/nm-setting-vpn.c
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-03-26 16:35:26 +0100
committerThomas Haller <thaller@redhat.com>2020-04-04 19:51:34 +0200
commit3d9d2ad6511ef27dd695c0611b5c3a01523e36a3 (patch)
treeeb6a6f50f426e0f165efdd4b31e3fd3d6350254e /libnm-core/nm-setting-vpn.c
parent3bca926d20fe5e55d515a59fedf7807464e31c89 (diff)
downloadNetworkManager-3d9d2ad6511ef27dd695c0611b5c3a01523e36a3.tar.gz
libnm: avoid cloning secrets during vpn_secrets_from_dbus()
When we use _nm_utils_strdict_from_dbus(), we clone the secrets, but don't use nm_free_secret() for freeing them. And in fact, we clone the setings twice. It't really not too nice. Implement this without the property setter.
Diffstat (limited to 'libnm-core/nm-setting-vpn.c')
-rw-r--r--libnm-core/nm-setting-vpn.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/libnm-core/nm-setting-vpn.c b/libnm-core/nm-setting-vpn.c
index d5d37c0907..ab712fdaad 100644
--- a/libnm-core/nm-setting-vpn.c
+++ b/libnm-core/nm-setting-vpn.c
@@ -934,11 +934,26 @@ vpn_secrets_from_dbus (NMSetting *setting,
NMSettingParseFlags parse_flags,
GError **error)
{
- nm_auto_unset_gvalue GValue object_value = G_VALUE_INIT;
+ NMSettingVpn *self = NM_SETTING_VPN (setting);
+ NMSettingVpnPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (self);
+ gs_unref_hashtable GHashTable *hash_free = NULL;
+ GVariantIter iter;
+ const char *key;
+ const char *val;
+
+ hash_free = g_steal_pointer (&priv->secrets);
- g_value_init (&object_value, G_TYPE_HASH_TABLE);
- _nm_utils_strdict_from_dbus (value, &object_value);
- return nm_g_object_set_property (G_OBJECT (setting), property, &object_value, error);
+ g_variant_iter_init (&iter, value);
+ while (g_variant_iter_next (&iter, "{&s&s}", &key, &val)) {
+ if (!key[0])
+ continue;
+ g_hash_table_insert (_ensure_strdict (&priv->secrets, TRUE),
+ g_strdup (key),
+ g_strdup (val));
+ }
+
+ _notify (self, PROP_SECRETS);
+ return TRUE;
}
static GVariant *