]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Fix using $ (IMAP SEARCHRES) in search seqset/uidset
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 13 Mar 2020 08:50:18 +0000 (10:50 +0200)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Fri, 20 Mar 2020 08:03:57 +0000 (08:03 +0000)
src/lib-storage/mail-search.c

index 6dcc7e22cb78aa4932f1bac95b97bb2d6712365d..013a93cd74509a63ce1f9ef7314486c3721c31fc 100644 (file)
@@ -58,6 +58,31 @@ mailbox_uidset_change(struct mail_search_arg *arg, struct mailbox *box,
        }
 }
 
+static void
+mail_search_arg_change_uidset(struct mail_search_args *args,
+                             struct mail_search_arg *arg,
+                             const ARRAY_TYPE(seq_range) *search_saved_uidset)
+{
+       for (; arg != NULL; arg = arg->next) {
+               switch (arg->type) {
+               case SEARCH_UIDSET:
+                       T_BEGIN {
+                               mailbox_uidset_change(arg, args->box,
+                                                     search_saved_uidset);
+                       } T_END;
+                       break;
+               case SEARCH_INTHREAD:
+               case SEARCH_SUB:
+               case SEARCH_OR:
+                       mail_search_arg_change_uidset(args, arg->value.subargs,
+                                                     search_saved_uidset);
+                       break;
+               default:
+                       break;
+               }
+       }
+}
+
 void mail_search_arg_init(struct mail_search_args *args,
                          struct mail_search_arg *arg,
                          bool change_uidsets,
@@ -138,6 +163,12 @@ void mail_search_args_init(struct mail_search_args *args,
        }
 
        args->box = box;
+       if (change_uidsets) {
+               /* Change uidsets before simplifying the args, since it can't
+                  handle search_saved_uidset. */
+               mail_search_arg_change_uidset(args, args->args,
+                                             search_saved_uidset);
+       }
        if (!args->simplified)
                mail_search_args_simplify(args);
        mail_search_arg_init(args, args->args, change_uidsets,