Mercurial > dovecot > core-2.2
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)