From: Timo Sirainen Date: Mon, 15 Jun 2015 21:29:07 +0000 (+0300) Subject: fts: Avoid expanding mail_search_args multiple times (for optimization & crash-avoidance) X-Git-Tag: 2.2.19.rc1~332 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=44ca7644e6df9e5ce7e7d0cc3767f63153c10bd7;p=thirdparty%2Fdovecot%2Fcore.git fts: Avoid expanding mail_search_args multiple times (for optimization & crash-avoidance) Primarily this fixes the crash: index-search-result.c: line 132 (index_search_result_update_flags): assertion failed: (result->search_args->args == &search_arg) It could be triggered by: a search return (update) body body seen b store 1 +flags \seen c store 1 -flags \seen --- diff --git a/src/lib-storage/mail-search.h b/src/lib-storage/mail-search.h index 4f4d023c45..90f0dc680a 100644 --- a/src/lib-storage/mail-search.h +++ b/src/lib-storage/mail-search.h @@ -115,6 +115,9 @@ struct mail_search_args { /* Stop mail_search_next() when finding a non-matching mail. (Could be useful when wanting to find only the oldest mails.) */ unsigned int stop_on_nonmatch:1; + /* fts plugin has already expanded the search args - no need to do + it again. */ + unsigned int fts_expanded:1; }; #define ARG_SET_RESULT(arg, res) \ diff --git a/src/plugins/fts/fts-search-args.c b/src/plugins/fts/fts-search-args.c index afd36b1c0f..1de11380f4 100644 --- a/src/plugins/fts/fts-search-args.c +++ b/src/plugins/fts/fts-search-args.c @@ -185,6 +185,13 @@ int fts_search_args_expand(struct fts_backend *backend, { struct mail_search_arg *args_dup, *orig_args = args->args; + /* don't keep re-expanding every time the search args are used. + this is especially important to avoid an assert-crash in + index_search_result_update_flags(). */ + if (args->fts_expanded) + return 0; + args->fts_expanded = TRUE; + /* duplicate the args, so if expansion fails we haven't changed anything */ args_dup = mail_search_arg_dup(args->pool, args->args);