From: Aki Tuomi Date: Tue, 6 Mar 2018 13:15:01 +0000 (+0200) Subject: lib-master: Correctly match when local_name has multiple names X-Git-Tag: 2.3.1~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bed7043593074a3e47332d3dd1c7ba0b636e7ff3;p=thirdparty%2Fdovecot%2Fcore.git lib-master: Correctly match when local_name has multiple names Reported by J. Nick Koston --- diff --git a/src/lib-master/master-service-settings-cache.c b/src/lib-master/master-service-settings-cache.c index 63d51c34a9..067ce5a84b 100644 --- a/src/lib-master/master-service-settings-cache.c +++ b/src/lib-master/master-service-settings-cache.c @@ -118,6 +118,22 @@ int master_service_settings_cache_init_filter(struct master_service_settings_cac return 0; } +static bool +match_local_name(const char *local_name, + const char *filter_local_name) +{ + /* Handle multiple names separated by spaces in local_name + * Ex: local_name "mail.domain.tld domain.tld mx.domain.tld" { ... } */ + const char *ptr; + while((ptr = strchr(local_name, ' ')) != NULL) { + if (dns_match_wildcard(filter_local_name, + t_strdup_until(local_name, ptr)) == 0) + return TRUE; + local_name = ptr+1; + } + return dns_match_wildcard(filter_local_name, local_name) == 0; +} + /* Remove any elements which there is no filter for */ static void master_service_settings_cache_fix_input(struct master_service_settings_cache *cache, @@ -139,7 +155,7 @@ master_service_settings_cache_fix_input(struct master_service_settings_cache *ca filter->remote_bits)) found_rip = TRUE; if (input->local_name != NULL && filter->local_name != NULL && - dns_match_wildcard(input->local_name, filter->local_name) == 0) + match_local_name(input->local_name, filter->local_name)) found_local_name = TRUE; filter = filter->next; };