changeset 21280:953aac0beb29

config: Avoid excessive data stack usage when matching local_name 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
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Fri, 09 Dec 2016 11:11:11 +0000
parents 136a42b63ef8
children 1ba00e3ae6cd
files src/config/config-filter.c
diffstat 1 files changed, 20 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/config/config-filter.c	Fri Dec 09 09:57:57 2016 +0100
+++ b/src/config/config-filter.c	Fri Dec 09 11:11:11 2016 +0000
@@ -31,22 +31,32 @@
 	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;
 	}