]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
config: Avoid excessive data stack usage when matching local_name
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 9 Dec 2016 11:11:11 +0000 (11:11 +0000)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 9 Dec 2016 11:13:21 +0000 (11:13 +0000)
Moved config_filter_match_local_name() to its own function to make
adding the data stack frame easier.

Based on patch by J. Nick Koston

src/config/config-filter.c

index 4c2071a2c87404517779a6c7ed4ce103b9960ff2..9f4d525e89e3a417b9aec8faf3fa04edd4b232f1 100644 (file)
@@ -31,22 +31,32 @@ static bool config_filter_match_service(const struct config_filter *mask,
        return TRUE;
 }
 
+static bool
+config_filter_match_local_name(const struct config_filter *mask,
+                              const char *filter_local_name)
+{
+       /* Handle multiple names seperated by spaces in local_name
+          * Ex: local_name "mail.domain.tld domain.tld mx.domain.tld" { ... } */
+       const char *const *local_name = t_strsplit_spaces(mask->local_name, " ");
+
+       for (; *local_name != NULL; local_name++) {
+               if (dns_match_wildcard(filter_local_name, *local_name) == 0)
+                       return TRUE;
+       }
+       return FALSE;
+}
+
 static bool config_filter_match_rest(const struct config_filter *mask,
                                     const struct config_filter *filter)
 {
+       bool matched;
+
        if (mask->local_name != NULL) {
                if (filter->local_name == NULL)
                        return FALSE;
-               /* Handle multiple names seperated by spaces in local_name
-                * Ex: local_name "mail.domain.tld domain.tld mx.domain.tld" { ... } */
-               const char *const *local_name = t_strsplit_spaces(mask->local_name, " ");
-               bool matched = FALSE;
-               for (; *local_name != NULL; local_name++) {
-                       if (dns_match_wildcard(filter->local_name, *local_name) == 0) {
-                               matched = TRUE;
-                               break;
-                       }
-               }
+               T_BEGIN {
+                       matched = config_filter_match_local_name(mask, filter->local_name);
+               } T_END;
                if (!matched)
                        return FALSE;
        }