summaryrefslogtreecommitdiff
path: root/pkcs11/secret-store
diff options
context:
space:
mode:
authorIain Lane <iainl@gnome.org>2019-01-30 14:27:12 +0000
committerIain Lane <iainl@gnome.org>2019-01-30 14:42:42 +0000
commit3091bf66c07f8df66876ecc7832371170743b052 (patch)
tree40d866a556bfb81ebcb83bf2a19af6f280ad3f48 /pkcs11/secret-store
parent23fdfe728a27a01ef50affd849be5188c0cda954 (diff)
downloadgnome-keyring-3091bf66c07f8df66876ecc7832371170743b052.tar.gz
secret-store: Sort fields alphabetically before outputting
The assumption that we'd get values out of a hash table in the same order we put them in stopped holding with GLib 2.59: ERROR:…/gnome-keyring/pkcs11/secret-store/test-secret-item.c:379:test_fields_attr: assertion failed: (memcmp (buffer, "name1\0value1\0name2\0value2", 26) == 0) Let's ensure a consistent order by sorting the fields before returning them. Closes #21.
Diffstat (limited to 'pkcs11/secret-store')
-rw-r--r--pkcs11/secret-store/gkm-secret-fields.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/pkcs11/secret-store/gkm-secret-fields.c b/pkcs11/secret-store/gkm-secret-fields.c
index 9cf74178..95558c10 100644
--- a/pkcs11/secret-store/gkm-secret-fields.c
+++ b/pkcs11/secret-store/gkm-secret-fields.c
@@ -214,9 +214,9 @@ gkm_secret_fields_serialize (CK_ATTRIBUTE_PTR attr,
GHashTable *fields,
const gchar *schema_name)
{
- GHashTableIter iter;
+ GList *l, *keys;
gboolean saw_schema = FALSE;
- gpointer key;
+ const gchar *key;
gpointer value;
GString *result;
CK_RV rv;
@@ -224,10 +224,15 @@ gkm_secret_fields_serialize (CK_ATTRIBUTE_PTR attr,
g_assert (attr != NULL);
g_assert (fields != NULL);
+ keys = g_hash_table_get_keys (fields);
+ keys = g_list_sort (keys, (GCompareFunc) g_strcmp0);
+
if (!attr->pValue) {
attr->ulValueLen = 0;
- g_hash_table_iter_init (&iter, fields);
- while (g_hash_table_iter_next (&iter, &key, &value)) {
+ for (l = keys; l != NULL; l = l->next) {
+ key = (const gchar *) l->data;
+ value = g_hash_table_lookup (fields, key);
+
if (g_str_equal (key, GKM_SECRET_FIELD_SCHEMA))
saw_schema = TRUE;
attr->ulValueLen += strlen (key);
@@ -239,12 +244,15 @@ gkm_secret_fields_serialize (CK_ATTRIBUTE_PTR attr,
attr->ulValueLen += strlen (schema_name);
attr->ulValueLen += 2;
}
+ if (keys != NULL)
+ g_list_free (keys);
return CKR_OK;
}
result = g_string_sized_new (256);
- g_hash_table_iter_init (&iter, fields);
- while (g_hash_table_iter_next (&iter, &key, &value)) {
+ for (l = keys; l != NULL; l = l->next) {
+ key = (const gchar *) l->data;
+ value = g_hash_table_lookup (fields, key);
if (g_str_equal (key, GKM_SECRET_FIELD_SCHEMA))
saw_schema = TRUE;
g_string_append (result, key);
@@ -261,6 +269,8 @@ gkm_secret_fields_serialize (CK_ATTRIBUTE_PTR attr,
rv = gkm_attribute_set_data (attr, result->str, result->len);
g_string_free (result, TRUE);
+ if (keys != NULL)
+ g_list_free (keys);
return rv;
}