From: Timo Sirainen Date: Wed, 21 Jul 2021 15:12:36 +0000 (+0300) Subject: lib-storage: mail_cache_*_fields - Check for invalid header names while parsing config X-Git-Tag: 2.3.17~266 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf111f68307b898f2cdd7e3703314efc42aeb87a;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: mail_cache_*_fields - Check for invalid header names while parsing config This way the errors are noticed early on. --- diff --git a/src/config/settings-get.pl b/src/config/settings-get.pl index 644b9b5e64..e900baaf7d 100755 --- a/src/config/settings-get.pl +++ b/src/config/settings-get.pl @@ -20,6 +20,7 @@ print '#include "net.h"'."\n"; print '#include "unichar.h"'."\n"; print '#include "hash-method.h"'."\n"; print '#include "settings-parser.h"'."\n"; +print '#include "message-header-parser.h"'."\n"; print '#include "all-settings.h"'."\n"; print '#include '."\n"; print '#include '."\n"; diff --git a/src/lib-storage/mail-storage-settings.c b/src/lib-storage/mail-storage-settings.c index 0576262852..c9e5ce9c41 100644 --- a/src/lib-storage/mail-storage-settings.c +++ b/src/lib-storage/mail-storage-settings.c @@ -8,6 +8,7 @@ #include "hostpid.h" #include "settings-parser.h" #include "message-address.h" +#include "message-header-parser.h" #include "smtp-address.h" #include "mail-index.h" #include "mail-user.h" @@ -433,6 +434,25 @@ fix_base_path(struct mail_user_settings *set, pool_t pool, const char **str) } /* */ +static bool mail_cache_fields_parse(const char *key, const char *value, + const char **error_r) +{ + const char *const *arr; + + for (arr = t_strsplit_spaces(value, " ,"); *arr != NULL; arr++) { + const char *name = *arr; + + if (strncasecmp(name, "hdr.", 4) == 0 && + !message_header_name_is_valid(name+4)) { + *error_r = t_strdup_printf( + "Invalid %s: %s is not a valid header name", + key, name); + return FALSE; + } + } + return TRUE; +} + static bool mail_storage_settings_check(void *_set, pool_t pool, const char **error_r) { @@ -579,6 +599,15 @@ static bool mail_storage_settings_check(void *_set, pool_t pool, set->parsed_mail_attachment_content_type_filter = array_front(&content_types); } + if (!mail_cache_fields_parse("mail_cache_fields", + set->mail_cache_fields, error_r)) + return FALSE; + if (!mail_cache_fields_parse("mail_always_cache_fields", + set->mail_always_cache_fields, error_r)) + return FALSE; + if (!mail_cache_fields_parse("mail_never_cache_fields", + set->mail_never_cache_fields, error_r)) + return FALSE; return TRUE; }