diff options
author | Thomas Haller <thaller@redhat.com> | 2020-03-26 16:35:26 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-04-04 19:51:34 +0200 |
commit | 3d9d2ad6511ef27dd695c0611b5c3a01523e36a3 (patch) | |
tree | eb6a6f50f426e0f165efdd4b31e3fd3d6350254e /libnm-core/nm-setting-vpn.c | |
parent | 3bca926d20fe5e55d515a59fedf7807464e31c89 (diff) | |
download | NetworkManager-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.c | 23 |
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 * |