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