]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
virtual: virtual_backend_box_lookup() - Enforce callers to check if the call succeeded
authorMarco Bettini <marco.bettini@open-xchange.com>
Mon, 20 Mar 2023 14:00:48 +0000 (14:00 +0000)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 3 Apr 2023 08:48:28 +0000 (08:48 +0000)
src/plugins/virtual/virtual-mail.c
src/plugins/virtual/virtual-storage.c
src/plugins/virtual/virtual-storage.h
src/plugins/virtual/virtual-sync.c

index 21459bae316663a42877da4d28609229333c4708..fd8303fc587c7f4da90a3072dd5c426d07480fae 100644 (file)
@@ -112,8 +112,8 @@ static int backend_mail_get(struct virtual_mail *vmail,
                return 0;
        }
 
-       bbox = virtual_backend_box_lookup(mbox, vmail->cur_vrec.mailbox_id);
-       i_assert(bbox != NULL);
+       if (!virtual_backend_box_lookup(mbox, vmail->cur_vrec.mailbox_id, &bbox))
+               i_unreached();
 
        vmail->cur_backend_mail = backend_mail_find(vmail, bbox->box);
        if (vmail->cur_backend_mail == NULL) {
index f88a279752243bfe08782ceaf5be6f062942d47a..6d7dd98156a139c764722ee16f6aa382798ec1d1 100644 (file)
@@ -124,21 +124,24 @@ virtual_backend_box_lookup_name(struct virtual_mailbox *mbox, const char *name)
        return NULL;
 }
 
-struct virtual_backend_box *
-virtual_backend_box_lookup(struct virtual_mailbox *mbox, uint32_t mailbox_id)
+bool virtual_backend_box_lookup(struct virtual_mailbox *mbox, uint32_t mailbox_id,
+                               struct virtual_backend_box **bbox_r)
 {
        struct virtual_backend_box *const *bboxes;
        unsigned int i, count;
 
+       *bbox_r = NULL;
        if (mailbox_id == 0)
-               return NULL;
+               return FALSE;
 
        bboxes = array_get(&mbox->backend_boxes, &count);
        for (i = 0; i < count; i++) {
-               if (bboxes[i]->mailbox_id == mailbox_id)
-                       return bboxes[i];
+               if (bboxes[i]->mailbox_id == mailbox_id) {
+                       *bbox_r = bboxes[i];
+                       return TRUE;
+               }
        }
-       return NULL;
+       return FALSE;
 }
 
 static bool virtual_mailbox_is_in_open_stack(struct virtual_storage *storage,
index 1f34e3930ced250ae2007c40783806755f65ee05..4bb794fc399fee35e5cac339022e7596443d63b7 100644 (file)
@@ -200,8 +200,8 @@ int virtual_mailbox_ext_header_read(struct virtual_mailbox *mbox,
 
 struct virtual_backend_box *
 virtual_backend_box_lookup_name(struct virtual_mailbox *mbox, const char *name);
-struct virtual_backend_box *
-virtual_backend_box_lookup(struct virtual_mailbox *mbox, uint32_t mailbox_id);
+bool virtual_backend_box_lookup(struct virtual_mailbox *mbox, uint32_t mailbox_id,
+                               struct virtual_backend_box **vbox_r);
 
 int virtual_backend_box_open(struct virtual_mailbox *mbox,
                             struct virtual_backend_box *bbox);
index b969e109feb380bfaf329976f175f0e237a23202..df3f9e69d69006fb201dd0ebc535ed508e76e560 100644 (file)
@@ -487,8 +487,8 @@ static int virtual_sync_index_rec(struct virtual_sync_context *ctx,
                                      &data, NULL);
                vrec = data;
 
-               bbox = virtual_backend_box_lookup(ctx->mbox, vrec->mailbox_id);
-               if (bbox == NULL)
+               if (!virtual_backend_box_lookup(ctx->mbox, vrec->mailbox_id,
+                                               &bbox))
                        continue;
                if (!bbox->box->opened) {
                        if (virtual_backend_box_open(ctx->mbox, bbox) < 0) {
@@ -1486,9 +1486,10 @@ static void virtual_sync_backend_map_uids(struct virtual_sync_context *ctx)
                                add_rec.rec.real_uid = uidmap[j].real_uid;
                                array_push_back(&ctx->all_adds, &add_rec);
                        }
-                       bbox = virtual_backend_box_lookup(ctx->mbox,
-                                                         vrec->mailbox_id);
-                       if (bbox == NULL || bbox->first_sync) {
+                       if (!virtual_backend_box_lookup(ctx->mbox,
+                                                       vrec->mailbox_id,
+                                                       &bbox) ||
+                           bbox->first_sync) {
                                /* the entire mailbox is lost */
                                mail_index_expunge(ctx->trans, vseq);
                                continue;
@@ -1593,8 +1594,17 @@ static int virtual_sync_backend_sort_new(struct virtual_sync_context *ctx)
                vrec = &adds[i].rec;
 
                if (bbox == NULL || bbox->mailbox_id != vrec->mailbox_id) {
-                       bbox = virtual_backend_box_lookup(ctx->mbox,
-                                                         vrec->mailbox_id);
+                       /* The mailbox_id comes from ctx->all_adds, which is
+                          filled earlier in this sync. The mailbox_ids in it
+                          come via mbox->backend_boxes, so the backend box is
+                          guaranteed to have existed already in this sync.
+                          Since backend_boxes are never removed during the sync,
+                          the lookup is guaranteed to find it here.
+                          (backend_boxes removal is done only while opening
+                          the virtual mailbox in virtual_mailbox_open() ) */
+                       if (!virtual_backend_box_lookup(ctx->mbox,
+                                                       vrec->mailbox_id, &bbox))
+                                  i_unreached();
                        if (!bbox->box->opened &&
                            virtual_backend_box_open(ctx->mbox, bbox) < 0)
                                return -1;
@@ -1648,8 +1658,11 @@ static int virtual_sync_backend_add_new(struct virtual_sync_context *ctx)
        for (bbox = NULL, i = 0; i < count; i++) {
                vrec = &adds[i].rec;
                if (bbox == NULL || bbox->mailbox_id != vrec->mailbox_id) {
-                       bbox = virtual_backend_box_lookup(ctx->mbox,
-                                                         vrec->mailbox_id);
+                       if (!virtual_backend_box_lookup(ctx->mbox,
+                                                       vrec->mailbox_id, &bbox)) {
+                               /* See virtual_sync_backend_sort_new() */
+                               i_unreached();
+                       }
                        if (!bbox->box->opened &&
                            virtual_backend_box_open(ctx->mbox, bbox) < 0)
                                return -1;
@@ -1672,8 +1685,12 @@ static int virtual_sync_backend_add_new(struct virtual_sync_context *ctx)
        for (bbox = NULL, i = 0; i < count; i++) {
                vrec = &adds[i].rec;
                if (bbox == NULL || bbox->mailbox_id != vrec->mailbox_id) {
-                       bbox = virtual_backend_box_lookup(ctx->mbox,
-                                                         vrec->mailbox_id);
+                       if (!virtual_backend_box_lookup(ctx->mbox,
+                                                       vrec->mailbox_id, &bbox)) {
+                               /* See virtual_sync_backend_sort_new() */
+                               i_unreached();
+                       }
+
                }
 
                if (!array_bsearch_insert_pos(&bbox->uids, &vrec->real_uid,
@@ -1722,9 +1739,8 @@ virtual_sync_apply_existing_appends(struct virtual_sync_context *ctx)
                mail_index_lookup_uid(ctx->sync_view, seq, &uidmap.virtual_uid);
 
                if (bbox == NULL || bbox->mailbox_id != vrec->mailbox_id) {
-                       bbox = virtual_backend_box_lookup(ctx->mbox,
-                                                         vrec->mailbox_id);
-                       if (bbox == NULL) {
+                       if (!virtual_backend_box_lookup(ctx->mbox,
+                                                       vrec->mailbox_id, &bbox)) {
                                mail_index_expunge(ctx->trans, seq);
                                continue;
                        }
@@ -1760,9 +1776,8 @@ virtual_sync_apply_existing_expunges(struct virtual_mailbox *mbox,
                vrec = data;
 
                if (bbox == NULL || bbox->mailbox_id != vrec->mailbox_id) {
-                       bbox = virtual_backend_box_lookup(mbox,
-                                                         vrec->mailbox_id);
-                       if (bbox == NULL)
+                       if (!virtual_backend_box_lookup(mbox,
+                                                       vrec->mailbox_id, &bbox))
                                continue;
                        if (!array_is_created(&bbox->sync_outside_expunges))
                                i_array_init(&bbox->sync_outside_expunges, 32);