]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
virtual: Add and use virtual_sync_deinit() to free the context
authorAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 6 Oct 2023 06:59:38 +0000 (09:59 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 10 Oct 2023 13:05:41 +0000 (13:05 +0000)
This makes sure the memory is always freed.

src/plugins/virtual/virtual-sync.c

index 40e221fb2d3865766186c1c717e27f06cca182af..46da8fb0ef8e71bc21980d2b2c54df65823a62ab 100644 (file)
@@ -1798,6 +1798,19 @@ virtual_sync_apply_existing_expunges(struct virtual_mailbox *mbox,
        }
 }
 
+static void virtual_sync_deinit(struct virtual_sync_context **_ctx)
+{
+       struct virtual_sync_context *ctx = *_ctx;
+       if (ctx == NULL)
+               return;
+       *_ctx = NULL;
+
+       array_free(&ctx->sync_expunges);
+       array_free(&ctx->all_adds);
+       array_free(&ctx->all_mails);
+       i_free(ctx);
+}
+
 static int virtual_sync_mail_mailbox_cmp(const struct virtual_sync_mail *m1,
                                         const struct virtual_sync_mail *m2)
 {
@@ -1876,9 +1889,6 @@ static int virtual_sync_backend_boxes(struct virtual_sync_context *ctx)
                        i_assert(uidmap->virtual_uid > 0);
        }
 #endif
-       array_free(&ctx->all_adds);
-       if (array_is_created(&ctx->all_mails))
-               array_free(&ctx->all_mails);
        return ret;
 }
 
@@ -1917,7 +1927,7 @@ static int virtual_sync_finish(struct virtual_sync_context *ctx, bool success)
                }
                mail_index_sync_rollback(&ctx->index_sync_ctx);
        }
-       i_free(ctx);
+       virtual_sync_deinit(&ctx);
        return ret;
 }
 
@@ -1951,7 +1961,7 @@ static int virtual_sync(struct virtual_mailbox *mbox,
        if (ret <= 0) {
                if (ret < 0)
                        mailbox_set_index_error(&mbox->box);
-               i_free(ctx);
+               virtual_sync_deinit(&ctx);
                return ret;
        }