summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2023-01-09 22:33:28 +0100
committerThomas Haller <thaller@redhat.com>2023-01-11 12:45:35 +0100
commit96d01a5f8ba12f53f7c00666138ec21a10bfcdc4 (patch)
tree5e3e6ff7c1b6c6fb156b1ae69fd3f92ddf77b1f1
parent4c2db6a3fd18f3c91709925a5038d74a404a8a1f (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.c14
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,