From: Timo Sirainen Date: Mon, 28 Feb 2011 16:57:21 +0000 (+0200) Subject: doveadm: Unload plugins only after calling command's deinit() function. X-Git-Tag: 2.0.10~27 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2f414d71a0c7c857485c8e4bd2fb1d9f13c894ec;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Unload plugins only after calling command's deinit() function. This fixes a crash on deinit when using a plugin that hooks into user.deinit(). --- diff --git a/src/doveadm/doveadm-mail.c b/src/doveadm/doveadm-mail.c index 2e71ed7e6c..35d2e3c276 100644 --- a/src/doveadm/doveadm-mail.c +++ b/src/doveadm/doveadm-mail.c @@ -248,7 +248,6 @@ void doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx, i_fatal("%s", error); else if (ret == 0) i_fatal("User doesn't exist"); - mail_storage_service_deinit(&ctx->storage_service); } static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED) @@ -319,7 +318,6 @@ doveadm_mail_all_users(struct doveadm_mail_cmd_context *ctx, char *argv[], i_set_failure_prefix("doveadm: "); if (ret < 0) i_error("Failed to iterate through some users"); - mail_storage_service_deinit(&ctx->storage_service); } static void @@ -420,14 +418,17 @@ doveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[]) service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP; doveadm_mail_all_users(ctx, argv, wildcard_user, service_flags); } + if (ctx->search_args != NULL) + mail_search_args_unref(&ctx->search_args); doveadm_mail_server_flush(); ctx->v.deinit(ctx); doveadm_print_flush(); + /* service deinit unloads mail plugins, so do it late */ + mail_storage_service_deinit(&ctx->storage_service); + if (ctx->failed) exit(FATAL_DEFAULT); - if (ctx->search_args != NULL) - mail_search_args_unref(&ctx->search_args); pool_unref(&ctx->pool); }