]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm index: Fix for fts crashing on virtual folders
authorMarco Bettini <marco.bettini@open-xchange.com>
Wed, 25 Oct 2023 12:30:16 +0000 (12:30 +0000)
committerMarco Bettini <marco.bettini@open-xchange.com>
Thu, 26 Oct 2023 07:56:21 +0000 (07:56 +0000)
Broken by: d1be7f323f (implemented in indexer but not in doveadm)

src/doveadm/doveadm-mail-index.c

index dd75e04c9601205515df1b532f8ce36f3c827266..03426c7940d42ecccec355a5f49ebf95bf760448 100644 (file)
@@ -7,7 +7,7 @@
 #include "istream.h"
 #include "ostream.h"
 #include "mail-namespace.h"
-#include "mail-storage.h"
+#include "mail-storage-private.h"
 #include "mail-search-build.h"
 #include "mailbox-list-iter.h"
 #include "doveadm-settings.h"
@@ -28,8 +28,8 @@ struct index_cmd_context {
        bool have_wildcards:1;
 };
 
-static int cmd_index_box_precache(struct doveadm_mail_cmd_context *dctx,
-                                 struct mailbox *box)
+static int cmd_index_box_precache_real(struct doveadm_mail_cmd_context *dctx,
+                                      struct mailbox *box)
 {
        struct event *event = dctx->cctx->event;
        struct mailbox_status status;
@@ -114,6 +114,31 @@ static int cmd_index_box_precache(struct doveadm_mail_cmd_context *dctx,
        return ret;
 }
 
+static int cmd_index_box_precache(struct doveadm_mail_cmd_context *dctx,
+                                 struct mailbox *box);
+
+static int cmd_index_box_precache_virtual(struct doveadm_mail_cmd_context *dctx,
+                                         struct mailbox *box)
+{
+       ARRAY_TYPE(mailboxes) mailboxes;
+       t_array_init(&mailboxes, 8);
+       box->virtual_vfuncs->get_virtual_backend_boxes(box, &mailboxes, TRUE);
+
+       struct mailbox *bbox;
+       array_foreach_elem(&mailboxes, bbox)
+               if (cmd_index_box_precache(dctx, bbox) < 0)
+                       return -1;
+       return 0;
+}
+
+static int cmd_index_box_precache(struct doveadm_mail_cmd_context *dctx,
+                                 struct mailbox *box)
+{
+       return box->virtual_vfuncs == NULL ?
+              cmd_index_box_precache_real(dctx, box) :
+              cmd_index_box_precache_virtual(dctx, box);
+}
+
 static int
 cmd_index_box(struct index_cmd_context *ctx, const struct mailbox_info *info)
 {