changeset 21869:af53beea365a

lib-fs: Allow fs_set_metadata() to update already added metadata. Previously we were just appending the metadata multiple times with different values, which could have caused problems.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Fri, 31 Mar 2017 12:28:01 +0300
parents 84ab6a7f172f
children 2b29af6f65c8
files src/lib-fs/fs-api.c
diffstat 1 files changed, 20 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-fs/fs-api.c	Fri Mar 31 01:02:49 2017 +0300
+++ b/src/lib-fs/fs-api.c	Fri Mar 31 12:28:01 2017 +0300
@@ -312,14 +312,30 @@
 	} T_END;
 }
 
+static struct fs_metadata *
+fs_metadata_find_md(const ARRAY_TYPE(fs_metadata) *metadata,
+		    const char *key)
+{
+	struct fs_metadata *md;
+
+	array_foreach_modifiable(metadata, md) {
+		if (strcmp(md->key, key) == 0)
+			return md;
+	}
+	return NULL;
+}
+
 void fs_default_set_metadata(struct fs_file *file,
 			     const char *key, const char *value)
 {
 	struct fs_metadata *metadata;
 
 	fs_metadata_init(file);
-	metadata = array_append_space(&file->metadata);
-	metadata->key = p_strdup(file->metadata_pool, key);
+	metadata = fs_metadata_find_md(&file->metadata, key);
+	if (metadata == NULL) {
+		metadata = array_append_space(&file->metadata);
+		metadata->key = p_strdup(file->metadata_pool, key);
+	}
 	metadata->value = p_strdup(file->metadata_pool, value);
 }
 
@@ -331,11 +347,8 @@
 	if (!array_is_created(metadata))
 		return NULL;
 
-	array_foreach(metadata, md) {
-		if (strcmp(md->key, key) == 0)
-			return md->value;
-	}
-	return NULL;
+	md = fs_metadata_find_md(metadata, key);
+	return md == NULL ? NULL : md->value;
 }
 
 void fs_set_metadata(struct fs_file *file, const char *key, const char *value)