dovecot-2.2: fts: If filtering fails during search arg expansion...

dovecot at dovecot.org dovecot at dovecot.org
Sat May 9 10:03:50 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/07597666aa29
changeset: 18572:07597666aa29
user:      Timo Sirainen <tss at iki.fi>
date:      Sat May 09 13:01:45 2015 +0300
description:
fts: If filtering fails during search arg expansion, fail the fts search.

diffstat:

 src/plugins/fts/fts-search-args.c |  56 +++++++++++++++++++++++++-------------
 1 files changed, 37 insertions(+), 19 deletions(-)

diffs (131 lines):

diff -r 3363fadc2e13 -r 07597666aa29 src/plugins/fts/fts-search-args.c
--- a/src/plugins/fts/fts-search-args.c	Sat May 09 12:50:54 2015 +0300
+++ b/src/plugins/fts/fts-search-args.c	Sat May 09 13:01:45 2015 +0300
@@ -53,7 +53,7 @@
 	return or_arg;
 }
 
-static void
+static int
 fts_backend_dovecot_expand_lang_tokens(const ARRAY_TYPE(fts_user_language) *languages,
 				       pool_t pool,
 				       struct mail_search_arg *parent_arg,
@@ -75,14 +75,15 @@
 	/* add the word filtered */
 	array_foreach(languages, langp) {
 		token2 = t_strdup(token);
-		if ((*langp)->filter != NULL)
-			ret = fts_filter_filter((*langp)->filter, &token2, &error);
+		ret = (*langp)->filter == NULL ? 1 :
+			fts_filter_filter((*langp)->filter, &token2, &error);
 		if (ret > 0) {
 			token2 = t_strdup(token2);
 			array_append(&tokens, &token2, 1);
+		} else if (ret < 0) {
+			i_error("fts: Couldn't create search tokens: %s", error);
+			return -1;
 		}
-		else if (ret < 0)
-			i_error("fts: Couldn't create search tokens: %s", error);
 	}
 	array_sort(&tokens, i_strcmp_p);
 	strings_deduplicate(&tokens);
@@ -90,10 +91,11 @@
 	arg = fts_search_arg_create_or(orig_arg, pool, &tokens);
 	arg->next = parent_arg->value.subargs;
 	parent_arg->value.subargs = arg;
+	return 0;
 }
 
-static void fts_search_arg_expand(struct fts_backend *backend, pool_t pool,
-				  struct mail_search_arg **argp)
+static int fts_search_arg_expand(struct fts_backend *backend, pool_t pool,
+				 struct mail_search_arg **argp)
 {
 	const ARRAY_TYPE(fts_user_language) *languages;
 	struct mail_search_arg *and_arg, *orig_arg = *argp;
@@ -111,33 +113,39 @@
 	and_arg->type = SEARCH_SUB;
 	and_arg->match_not = orig_arg->match_not;
 	and_arg->next = orig_arg->next;
-	*argp = and_arg;
 
 	while (fts_tokenizer_next(tokenizer,
 	                          (const void *)orig_token,
 	                          orig_token_len, &token) > 0) {
-		fts_backend_dovecot_expand_lang_tokens(languages, pool, and_arg,
-						       orig_arg, orig_token,
-						       token);
+		if (fts_backend_dovecot_expand_lang_tokens(languages, pool, and_arg,
+							   orig_arg, orig_token,
+							   token) < 0)
+			return -1;
 	}
 	while (fts_tokenizer_next(tokenizer, NULL, 0, &token) > 0) {
-		fts_backend_dovecot_expand_lang_tokens(languages, pool, and_arg,
-		                                       orig_arg, orig_token,
-		                                       token);
+		if (fts_backend_dovecot_expand_lang_tokens(languages, pool, and_arg,
+							   orig_arg, orig_token,
+							   token) < 0)
+			return -1;
 	}
+	*argp = and_arg;
+	return 0;
 }
 
-static void
+static int
 fts_search_args_expand_tree(struct fts_backend *backend, pool_t pool,
 			    struct mail_search_arg **argp)
 {
+	int ret;
+
 	for (; *argp != NULL; argp = &(*argp)->next) {
 		switch ((*argp)->type) {
 		case SEARCH_OR:
 		case SEARCH_SUB:
 		case SEARCH_INTHREAD:
-			fts_search_args_expand_tree(backend, pool,
-						    &(*argp)->value.subargs);
+			if (fts_search_args_expand_tree(backend, pool,
+							&(*argp)->value.subargs) < 0)
+				return -1;
 			break;
 		case SEARCH_HEADER:
 		case SEARCH_HEADER_ADDRESS:
@@ -145,22 +153,32 @@
 		case SEARCH_BODY:
 		case SEARCH_TEXT:
 			T_BEGIN {
-				fts_search_arg_expand(backend, pool, argp);
+				ret = fts_search_arg_expand(backend, pool, argp);
 			} T_END;
+			if (ret < 0)
+				return -1;
 			break;
 		default:
 			break;
 		}
 	}
+	return 0;
 }
 
 int fts_search_args_expand(struct fts_backend *backend,
 			   struct mail_search_args *args)
 {
-	fts_search_args_expand_tree(backend, args->pool, &args->args);
+	struct mail_search_arg *args_dup;
+
+	/* duplicate the args, so if expansion fails we haven't changed
+	   anything */
+	args_dup = mail_search_arg_dup(args->pool, args->args);
+	if (fts_search_args_expand_tree(backend, args->pool, &args_dup) < 0)
+		return -1;
 
 	/* we'll need to re-simplify the args if we changed anything */
 	args->simplified = FALSE;
+	args->args = args_dup;
 	mail_search_args_simplify(args);
 	return 0;
 }


More information about the dovecot-cvs mailing list