]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: Correctly match when local_name has multiple names
authorAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 6 Mar 2018 13:15:01 +0000 (15:15 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Thu, 15 Mar 2018 12:58:19 +0000 (14:58 +0200)
Reported by J. Nick Koston <nick@cpanel.net>

src/lib-master/master-service-settings-cache.c

index f32a2a152e8c93397a4cff248a53420c684fb3bb..91d9eb04a317bd80e64e834236ad3f31b1ac2bf4 100644 (file)
@@ -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;
        };