diff options
author | Thomas Haller <thaller@redhat.com> | 2023-01-09 22:33:28 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2023-01-11 12:45:35 +0100 |
commit | 96d01a5f8ba12f53f7c00666138ec21a10bfcdc4 (patch) | |
tree | 5e3e6ff7c1b6c6fb156b1ae69fd3f92ddf77b1f1 | |
parent | 4c2db6a3fd18f3c91709925a5038d74a404a8a1f (diff) |
libnm: make NMSettingOvsExternalIDs.verify() deterministic
Iterating over a hash table is not deterministic. When we have
two invalid keys in ovs-external-ids, we should deterministically
get the same error message.
Instead, iterate over the (sorted) keys. This does have an overhead,
because we need to fetch the keys, and we need to lookup each value
by key. Still, correctness and determinism is more important.
-rw-r--r-- | src/libnm-core-impl/nm-setting-ovs-external-ids.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/libnm-core-impl/nm-setting-ovs-external-ids.c b/src/libnm-core-impl/nm-setting-ovs-external-ids.c index 44bb1d3e65..70b7c662aa 100644 --- a/src/libnm-core-impl/nm-setting-ovs-external-ids.c +++ b/src/libnm-core-impl/nm-setting-ovs-external-ids.c @@ -293,12 +293,16 @@ verify(NMSetting *setting, NMConnection *connection, GError **error) if (priv->data) { gs_free_error GError *local = NULL; - GHashTableIter iter; - const char *key; - const char *val; + const char *const *keys; + guint len; + guint i; + + keys = nm_setting_ovs_external_ids_get_data_keys(self, &len); + + for (i = 0; i < len; i++) { + const char *key = keys[i]; + const char *val = g_hash_table_lookup(priv->data, key); - g_hash_table_iter_init(&iter, priv->data); - while (g_hash_table_iter_next(&iter, (gpointer *) &key, (gpointer *) &val)) { if (!nm_setting_ovs_external_ids_check_key(key, &local)) { g_set_error(error, NM_CONNECTION_ERROR, |