dovecot-2.2: doveadm: Added missing error handling to various ma...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Jan 19 20:26:20 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/f2a0dd55ad37
changeset: 18175:f2a0dd55ad37
user: Timo Sirainen <tss at iki.fi>
date: Mon Jan 19 22:24:42 2015 +0200
description:
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.
diffstat:
src/doveadm/doveadm-mail-deduplicate.c | 15 +++++++++++----
src/doveadm/doveadm-mail-mailbox-metadata.c | 14 ++++++++++++--
src/doveadm/doveadm-mail.c | 10 ++++++++++
src/doveadm/doveadm-mail.h | 3 +++
src/doveadm/doveadm-mailbox-list-iter.c | 5 +++--
5 files changed, 39 insertions(+), 8 deletions(-)
diffs (189 lines):
diff -r e6d8d7e56828 -r f2a0dd55ad37 src/doveadm/doveadm-mail-deduplicate.c
--- a/src/doveadm/doveadm-mail-deduplicate.c Mon Jan 19 22:12:58 2015 +0200
+++ b/src/doveadm/doveadm-mail-deduplicate.c Mon Jan 19 22:24:42 2015 +0200
@@ -18,7 +18,8 @@
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 @@
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 @@
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 @@
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 @@
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 -r e6d8d7e56828 -r f2a0dd55ad37 src/doveadm/doveadm-mail-mailbox-metadata.c
--- a/src/doveadm/doveadm-mail-mailbox-metadata.c Mon Jan 19 22:12:58 2015 +0200
+++ b/src/doveadm/doveadm-mail-mailbox-metadata.c Mon Jan 19 22:24:42 2015 +0200
@@ -32,6 +32,7 @@
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 @@
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 @@
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 @@
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 @@
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 -r e6d8d7e56828 -r f2a0dd55ad37 src/doveadm/doveadm-mail.c
--- a/src/doveadm/doveadm-mail.c Mon Jan 19 22:12:58 2015 +0200
+++ b/src/doveadm/doveadm-mail.c Mon Jan 19 22:24:42 2015 +0200
@@ -89,6 +89,15 @@
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 @@
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 -r e6d8d7e56828 -r f2a0dd55ad37 src/doveadm/doveadm-mail.h
--- a/src/doveadm/doveadm-mail.h Mon Jan 19 22:12:58 2015 +0200
+++ b/src/doveadm/doveadm-mail.h Mon Jan 19 22:24:42 2015 +0200
@@ -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 @@
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 -r e6d8d7e56828 -r f2a0dd55ad37 src/doveadm/doveadm-mailbox-list-iter.c
--- a/src/doveadm/doveadm-mailbox-list-iter.c Mon Jan 19 22:12:58 2015 +0200
+++ b/src/doveadm/doveadm-mailbox-list-iter.c Mon Jan 19 22:24:42 2015 +0200
@@ -143,6 +143,7 @@
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 @@
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);
More information about the dovecot-cvs
mailing list