]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Added missing error handling to various mail commands.
authorTimo Sirainen <tss@iki.fi>
Mon, 19 Jan 2015 20:24:42 +0000 (22:24 +0200)
committerTimo Sirainen <tss@iki.fi>
Mon, 19 Jan 2015 20:24:42 +0000 (22:24 +0200)
This fixes assert-crash that happened when the commands failed, because they
hadn't set any exit_code.

src/doveadm/doveadm-mail-deduplicate.c
src/doveadm/doveadm-mail-mailbox-metadata.c
src/doveadm/doveadm-mail.c
src/doveadm/doveadm-mail.h
src/doveadm/doveadm-mailbox-list-iter.c

index 4148512056712c327917806a20a260199b025b7d..178fa28628e5dc8bd3725dc893abaa7c0a97e2a8 100644 (file)
@@ -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;
                }
index 4aa61a3804e8aa0173a07a7ce8abb93e2b03c934..ef8c3df8dd52f2d3577396939a564a6f9182f66e 100644 (file)
@@ -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;
index 58921f586e6b177a20cefa3b6eba704283230838..b4aef1fa4f43071ed077d219e6509e246028fdfb 100644 (file)
@@ -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;
index 47e3b58d8c2722c10f32f79031dae74db5a8bbab..1984046f8db40922ab63ad4015dfacd3b53bdff5 100644 (file)
@@ -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;
index 9c69097fd9db8208073b435457ab7adaa36d905c..95b413ae940a3b17f741169ff363e37e4ebefb09 100644 (file)
@@ -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);