From: Marco Bettini Date: Mon, 20 Mar 2023 14:00:48 +0000 (+0000) Subject: virtual: virtual_backend_box_lookup() - Enforce callers to check if the call succeeded X-Git-Tag: 2.3.21~97 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=37f46933cfc74a6fb5357cfe93377a7307a1a104;p=thirdparty%2Fdovecot%2Fcore.git virtual: virtual_backend_box_lookup() - Enforce callers to check if the call succeeded --- diff --git a/src/plugins/virtual/virtual-mail.c b/src/plugins/virtual/virtual-mail.c index 21459bae31..fd8303fc58 100644 --- a/src/plugins/virtual/virtual-mail.c +++ b/src/plugins/virtual/virtual-mail.c @@ -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) { diff --git a/src/plugins/virtual/virtual-storage.c b/src/plugins/virtual/virtual-storage.c index f88a279752..6d7dd98156 100644 --- a/src/plugins/virtual/virtual-storage.c +++ b/src/plugins/virtual/virtual-storage.c @@ -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, diff --git a/src/plugins/virtual/virtual-storage.h b/src/plugins/virtual/virtual-storage.h index 1f34e3930c..4bb794fc39 100644 --- a/src/plugins/virtual/virtual-storage.h +++ b/src/plugins/virtual/virtual-storage.h @@ -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); diff --git a/src/plugins/virtual/virtual-sync.c b/src/plugins/virtual/virtual-sync.c index b969e109fe..df3f9e69d6 100644 --- a/src/plugins/virtual/virtual-sync.c +++ b/src/plugins/virtual/virtual-sync.c @@ -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);