From: Timo Sirainen Date: Mon, 19 Jan 2015 20:24:42 +0000 (+0200) Subject: doveadm: Added missing error handling to various mail commands. X-Git-Tag: 2.2.16.rc1~131 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bb25bed75eefd011138ebf1b8e033fc8ef55ca74;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Added missing error handling to various mail commands. This fixes assert-crash that happened when the commands failed, because they hadn't set any exit_code. --- diff --git a/src/doveadm/doveadm-mail-deduplicate.c b/src/doveadm/doveadm-mail-deduplicate.c index 4148512056..178fa28628 100644 --- a/src/doveadm/doveadm-mail-deduplicate.c +++ b/src/doveadm/doveadm-mail-deduplicate.c @@ -18,7 +18,8 @@ struct deduplicate_cmd_context { bool by_msgid; }; -static int cmd_deduplicate_uidlist(struct mailbox *box, struct uidlist *uidlist) +static int cmd_deduplicate_uidlist(struct doveadm_mail_cmd_context *_ctx, + struct mailbox *box, struct uidlist *uidlist) { struct mailbox_transaction_context *trans; struct mail_search_context *search_ctx; @@ -47,10 +48,14 @@ static int cmd_deduplicate_uidlist(struct mailbox *box, struct uidlist *uidlist) while (mailbox_search_next(search_ctx, &mail)) mail_expunge(mail); - if (mailbox_search_deinit(&search_ctx) < 0) + if (mailbox_search_deinit(&search_ctx) < 0) { + doveadm_mail_failed_mailbox(_ctx, box); ret = -1; - if (mailbox_transaction_commit(&trans) < 0) + } + if (mailbox_transaction_commit(&trans) < 0) { + doveadm_mail_failed_mailbox(_ctx, box); ret = -1; + } return ret; } @@ -85,6 +90,7 @@ cmd_deduplicate_box(struct doveadm_mail_cmd_context *_ctx, continue; i_error("Couldn't lookup Message-ID: for UID=%u: %s", mail->uid, errstr); + doveadm_mail_failed_error(_ctx, error); ret = -1; break; } @@ -95,6 +101,7 @@ cmd_deduplicate_box(struct doveadm_mail_cmd_context *_ctx, continue; i_error("Couldn't lookup GUID: for UID=%u: %s", mail->uid, errstr); + doveadm_mail_failed_error(_ctx, error); ret = -1; break; } @@ -122,7 +129,7 @@ cmd_deduplicate_box(struct doveadm_mail_cmd_context *_ctx, iter = hash_table_iterate_init(hash); while (hash_table_iterate(iter, hash, &key, &value)) { T_BEGIN { - if (cmd_deduplicate_uidlist(box, value) < 0) + if (cmd_deduplicate_uidlist(_ctx, box, value) < 0) ret = -1; } T_END; } diff --git a/src/doveadm/doveadm-mail-mailbox-metadata.c b/src/doveadm/doveadm-mail-mailbox-metadata.c index 4aa61a3804..ef8c3df8dd 100644 --- a/src/doveadm/doveadm-mail-mailbox-metadata.c +++ b/src/doveadm/doveadm-mail-mailbox-metadata.c @@ -32,6 +32,7 @@ cmd_mailbox_metadata_set_run(struct doveadm_mail_cmd_context *_ctx, if (mailbox_open(box) < 0) { i_error("Failed to open mailbox: %s", mailbox_get_last_error(box, NULL)); + doveadm_mail_failed_mailbox(_ctx, box); mailbox_free(&box); return -1; } @@ -43,10 +44,12 @@ cmd_mailbox_metadata_set_run(struct doveadm_mail_cmd_context *_ctx, if (ret < 0) { i_error("Failed to set attribute: %s", mailbox_get_last_error(box, NULL)); + doveadm_mail_failed_mailbox(_ctx, box); mailbox_transaction_rollback(&trans); } else if (mailbox_transaction_commit(&trans) < 0) { i_error("Failed to commit transaction: %s", mailbox_get_last_error(box, NULL)); + doveadm_mail_failed_mailbox(_ctx, box); ret = -1; } @@ -145,6 +148,7 @@ cmd_mailbox_metadata_get_run(struct doveadm_mail_cmd_context *_ctx, if (mailbox_open(box) < 0) { i_error("Failed to open mailbox: %s", mailbox_get_last_error(box, NULL)); + doveadm_mail_failed_mailbox(_ctx, box); mailbox_free(&box); return -1; } @@ -154,6 +158,7 @@ cmd_mailbox_metadata_get_run(struct doveadm_mail_cmd_context *_ctx, if (ret < 0) { i_error("Failed to get attribute: %s", mailbox_get_last_error(box, NULL)); + doveadm_mail_failed_mailbox(_ctx, box); } else if (ret == 0) { /* not found, print as empty */ doveadm_print(""); @@ -225,17 +230,22 @@ cmd_mailbox_metadata_list_run(struct doveadm_mail_cmd_context *_ctx, if (mailbox_open(box) < 0) { i_error("Failed to open mailbox: %s", mailbox_get_last_error(box, NULL)); + doveadm_mail_failed_mailbox(_ctx, box); mailbox_free(&box); return -1; } if (ctx->key == NULL || ctx->key_type == MAIL_ATTRIBUTE_TYPE_PRIVATE) { - if (cmd_mailbox_metadata_list_run_iter(ctx, box, MAIL_ATTRIBUTE_TYPE_PRIVATE) < 0) + if (cmd_mailbox_metadata_list_run_iter(ctx, box, MAIL_ATTRIBUTE_TYPE_PRIVATE) < 0) { + doveadm_mail_failed_mailbox(_ctx, box); ret = -1; + } } if (ctx->key == NULL || ctx->key_type == MAIL_ATTRIBUTE_TYPE_SHARED) { - if (cmd_mailbox_metadata_list_run_iter(ctx, box, MAIL_ATTRIBUTE_TYPE_SHARED) < 0) + if (cmd_mailbox_metadata_list_run_iter(ctx, box, MAIL_ATTRIBUTE_TYPE_SHARED) < 0) { + doveadm_mail_failed_mailbox(_ctx, box); ret = -1; + } } mailbox_free(&box); return ret; diff --git a/src/doveadm/doveadm-mail.c b/src/doveadm/doveadm-mail.c index 58921f586e..b4aef1fa4f 100644 --- a/src/doveadm/doveadm-mail.c +++ b/src/doveadm/doveadm-mail.c @@ -89,6 +89,15 @@ void doveadm_mail_failed_mailbox(struct doveadm_mail_cmd_context *ctx, doveadm_mail_failed_storage(ctx, mailbox_get_storage(box)); } +void doveadm_mail_failed_list(struct doveadm_mail_cmd_context *ctx, + struct mailbox_list *list) +{ + enum mail_error error; + + mailbox_list_get_last_error(list, &error); + doveadm_mail_failed_error(ctx, error); +} + struct doveadm_mail_cmd_context * doveadm_mail_cmd_alloc_size(size_t size) { @@ -243,6 +252,7 @@ static int cmd_force_resync_run(struct doveadm_mail_cmd_context *ctx, if (mailbox_list_iter_deinit(&iter) < 0) { i_error("Listing mailboxes failed: %s", mailbox_list_get_last_error(user->namespaces->list, NULL)); + doveadm_mail_failed_list(ctx, user->namespaces->list); ret = -1; } return ret; diff --git a/src/doveadm/doveadm-mail.h b/src/doveadm/doveadm-mail.h index 47e3b58d8c..1984046f8d 100644 --- a/src/doveadm/doveadm-mail.h +++ b/src/doveadm/doveadm-mail.h @@ -9,6 +9,7 @@ #include "mail-storage-service.h" struct mailbox; +struct mailbox_list; struct mail_storage; struct mail_user; struct doveadm_mail_cmd_context; @@ -135,6 +136,8 @@ void doveadm_mail_failed_storage(struct doveadm_mail_cmd_context *ctx, struct mail_storage *storage); void doveadm_mail_failed_mailbox(struct doveadm_mail_cmd_context *ctx, struct mailbox *box); +void doveadm_mail_failed_list(struct doveadm_mail_cmd_context *ctx, + struct mailbox_list *list); extern struct doveadm_mail_cmd cmd_expunge; extern struct doveadm_mail_cmd cmd_search; diff --git a/src/doveadm/doveadm-mailbox-list-iter.c b/src/doveadm/doveadm-mailbox-list-iter.c index 9c69097fd9..95b413ae94 100644 --- a/src/doveadm/doveadm-mailbox-list-iter.c +++ b/src/doveadm/doveadm-mailbox-list-iter.c @@ -143,6 +143,7 @@ doveadm_mailbox_list_iter_full_init(struct doveadm_mail_cmd_context *ctx, int doveadm_mailbox_list_iter_deinit(struct doveadm_mailbox_list_iter **_iter) { struct doveadm_mailbox_list_iter *iter = *_iter; + enum mail_error error; int ret; *_iter = NULL; @@ -151,8 +152,8 @@ int doveadm_mailbox_list_iter_deinit(struct doveadm_mailbox_list_iter **_iter) ret = 0; else if ((ret = mailbox_list_iter_deinit(&iter->iter)) < 0) { i_error("Listing mailboxes failed: %s", - mailbox_list_get_last_error(iter->user->namespaces->list, NULL)); - doveadm_mail_failed_error(iter->ctx, MAIL_ERROR_TEMP); + mailbox_list_get_last_error(iter->user->namespaces->list, &error)); + doveadm_mail_failed_error(iter->ctx, error); } array_free(&iter->patterns); i_free(iter);