dovecot-2.2: imap: If SELECT fails with "mailbox is inconsistent...

dovecot at dovecot.org dovecot at dovecot.org
Tue Dec 3 17:29:52 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/9946079253c4
changeset: 17038:9946079253c4
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Dec 03 17:29:38 2013 +0200
description:
imap: If SELECT fails with "mailbox is inconsistent", disconnect client. (Plus related cleanups.)
The inconsistency can also be used to indicate that something is badly wrong
and nothing useful can be done before client reconnects.

diffstat:

 src/imap/cmd-append.c         |  23 ++++++++++-------------
 src/imap/cmd-create.c         |   2 +-
 src/imap/cmd-delete.c         |   2 +-
 src/imap/cmd-expunge.c        |   3 +--
 src/imap/cmd-getmetadata.c    |   2 +-
 src/imap/cmd-rename.c         |   2 +-
 src/imap/cmd-resetkey.c       |   2 +-
 src/imap/cmd-select.c         |  15 +++++----------
 src/imap/cmd-setmetadata.c    |   7 +++----
 src/imap/cmd-store.c          |   6 ++----
 src/imap/cmd-subscribe.c      |   4 ++--
 src/imap/cmd-thread.c         |   3 +--
 src/imap/imap-commands-util.c |  16 ++++++++++++++--
 src/imap/imap-commands-util.h |   3 +++
 src/imap/imap-search.c        |   3 +--
 15 files changed, 47 insertions(+), 46 deletions(-)

diffs (truncated from 372 to 300 lines):

diff -r 21d96c97f519 -r 9946079253c4 src/imap/cmd-append.c
--- a/src/imap/cmd-append.c	Tue Dec 03 17:17:03 2013 +0200
+++ b/src/imap/cmd-append.c	Tue Dec 03 17:29:38 2013 +0200
@@ -26,7 +26,6 @@
 struct cmd_append_context {
 	struct client *client;
         struct client_command_context *cmd;
-	struct mail_storage *storage;
 	struct mailbox *box;
         struct mailbox_transaction_context *t;
 	time_t started;
@@ -181,7 +180,7 @@
 	/* catenate URL */
 	ret = imap_msgpart_url_read_part(mpurl, &mpresult, &error);
 	if (ret < 0) {
-		client_send_storage_error(cmd, ctx->storage);
+		client_send_box_error(cmd, ctx->box);
 		return -1;
 	}
 	if (ret == 0) {
@@ -219,11 +218,11 @@
 			"read(%s) failed: %s (for CATENATE URL %s)",
 			i_stream_get_name(mpresult.input),
 			i_stream_get_error(mpresult.input), caturl);
-		client_send_storage_error(cmd, ctx->storage);
+		client_send_box_error(cmd, ctx->box);
 		ret = -1;
 	} else if (!mpresult.input->eof) {
 		/* save failed */
-		client_send_storage_error(cmd, ctx->storage);
+		client_send_box_error(cmd, ctx->box);
 		ret = -1;
 	} else {
 		/* all the input must be consumed, so istream-chain's read()
@@ -248,7 +247,7 @@
 	ret = imap_msgpart_url_parse(cmd->client->user, cmd->client->mailbox,
 				     caturl, &mpurl, &error);
 	if (ret < 0) {
-		client_send_storage_error(cmd, ctx->storage);
+		client_send_box_error(cmd, ctx->box);
 		return -1;
 	}
 	if (ret == 0) {
@@ -356,7 +355,7 @@
 			mailbox_save_cancel(&ctx->save_ctx);
 	} else {
 		if (mailbox_save_finish(&ctx->save_ctx) < 0) {
-			client_send_storage_error(cmd, ctx->storage);
+			client_send_box_error(cmd, ctx->box);
 			ctx->failed = TRUE;
 		}
 	}
@@ -532,7 +531,7 @@
 		else if (mailbox_keywords_create(ctx->box, keywords_list,
 						 &keywords) < 0) {
 			/* invalid keywords - delay failure */
-			client_send_storage_error(cmd, ctx->storage);
+			client_send_box_error(cmd, ctx->box);
 			ctx->failed = TRUE;
 		}
 	}
@@ -594,7 +593,7 @@
 					       internal_date, timezone_offset);
 		if (mailbox_save_begin(&ctx->save_ctx, ctx->input) < 0) {
 			/* save initialization failed */
-			client_send_storage_error(cmd, ctx->storage);
+			client_send_box_error(cmd, ctx->box);
 			ctx->failed = TRUE;
 		}
 	}
@@ -649,7 +648,7 @@
 
 	ret = mailbox_transaction_commit_get_changes(&ctx->t, &changes);
 	if (ret < 0) {
-		client_send_storage_error(cmd, ctx->storage);
+		client_send_box_error(cmd, ctx->box);
 		cmd_append_finish(ctx);
 		return TRUE;
 	}
@@ -845,7 +844,7 @@
 				mailbox_save_cancel(&ctx->save_ctx);
 		} else if (ctx->save_ctx == NULL) {
 			/* failed above */
-			client_send_storage_error(cmd, ctx->storage);
+			client_send_box_error(cmd, ctx->box);
 			ctx->failed = TRUE;
 		} else if (lit_offset != ctx->literal_size) {
 			/* client disconnected before it finished sending the
@@ -857,7 +856,7 @@
 		} else if (ctx->catenate) {
 			/* CATENATE isn't finished yet */
 		} else if (mailbox_save_finish(&ctx->save_ctx) < 0) {
-			client_send_storage_error(cmd, ctx->storage);
+			client_send_box_error(cmd, ctx->box);
 			ctx->failed = TRUE;
 		}
 
@@ -909,8 +908,6 @@
 	if (client_open_save_dest_box(cmd, mailbox, &ctx->box) < 0)
 		ctx->failed = TRUE;
 	else {
-		ctx->storage = mailbox_get_storage(ctx->box);
-
 		ctx->t = mailbox_transaction_begin(ctx->box,
 					MAILBOX_TRANSACTION_FLAG_EXTERNAL |
 					MAILBOX_TRANSACTION_FLAG_ASSIGN_UIDS);
diff -r 21d96c97f519 -r 9946079253c4 src/imap/cmd-create.c
--- a/src/imap/cmd-create.c	Tue Dec 03 17:17:03 2013 +0200
+++ b/src/imap/cmd-create.c	Tue Dec 03 17:29:38 2013 +0200
@@ -39,7 +39,7 @@
 
 	box = mailbox_alloc(ns->list, mailbox, 0);
 	if (mailbox_create(box, NULL, directory) < 0)
-		client_send_storage_error(cmd, mailbox_get_storage(box));
+		client_send_box_error(cmd, box);
 	else
 		client_send_tagline(cmd, "OK Create completed.");
 	mailbox_free(&box);
diff -r 21d96c97f519 -r 9946079253c4 src/imap/cmd-delete.c
--- a/src/imap/cmd-delete.c	Tue Dec 03 17:17:03 2013 +0200
+++ b/src/imap/cmd-delete.c	Tue Dec 03 17:29:38 2013 +0200
@@ -41,7 +41,7 @@
 	else {
 		errstr = mailbox_get_last_error(box, &error);
 		if (error != MAIL_ERROR_EXISTS)
-			client_send_storage_error(cmd, mailbox_get_storage(box));
+			client_send_box_error(cmd, box);
 		else {
 			/* mailbox has children */
 			client_send_tagline(cmd, t_strdup_printf("NO %s", errstr));
diff -r 21d96c97f519 -r 9946079253c4 src/imap/cmd-expunge.c
--- a/src/imap/cmd-expunge.c	Tue Dec 03 17:17:03 2013 +0200
+++ b/src/imap/cmd-expunge.c	Tue Dec 03 17:29:38 2013 +0200
@@ -35,8 +35,7 @@
 	if (ret < 0) {
 		errstr = mailbox_get_last_error(client->mailbox, &error);
 		if (error != MAIL_ERROR_PERM) {
-			client_send_storage_error(cmd,
-				mailbox_get_storage(client->mailbox));
+			client_send_box_error(cmd, client->mailbox);
 			return TRUE;
 		} else {
 			return cmd_sync(cmd, 0, IMAP_SYNC_FLAG_SAFE,
diff -r 21d96c97f519 -r 9946079253c4 src/imap/cmd-getmetadata.c
--- a/src/imap/cmd-getmetadata.c	Tue Dec 03 17:17:03 2013 +0200
+++ b/src/imap/cmd-getmetadata.c	Tue Dec 03 17:29:38 2013 +0200
@@ -374,7 +374,7 @@
 
 	ctx->box = mailbox_alloc(ns->list, mailbox, MAILBOX_FLAG_READONLY);
 	if (mailbox_open(ctx->box) < 0) {
-		client_send_storage_error(cmd, mailbox_get_storage(ctx->box));
+		client_send_box_error(cmd, ctx->box);
 		mailbox_free(&ctx->box);
 		return TRUE;
 	}
diff -r 21d96c97f519 -r 9946079253c4 src/imap/cmd-rename.c
--- a/src/imap/cmd-rename.c	Tue Dec 03 17:17:03 2013 +0200
+++ b/src/imap/cmd-rename.c	Tue Dec 03 17:29:38 2013 +0200
@@ -38,7 +38,7 @@
 	old_box = mailbox_alloc(old_ns->list, oldname, 0);
 	new_box = mailbox_alloc(new_ns->list, newname, 0);
 	if (mailbox_rename(old_box, new_box) < 0)
-		client_send_storage_error(cmd, mailbox_get_storage(old_box));
+		client_send_box_error(cmd, old_box);
 	else
 		client_send_tagline(cmd, "OK Rename completed.");
 	mailbox_free(&old_box);
diff -r 21d96c97f519 -r 9946079253c4 src/imap/cmd-resetkey.c
--- a/src/imap/cmd-resetkey.c	Tue Dec 03 17:17:03 2013 +0200
+++ b/src/imap/cmd-resetkey.c	Tue Dec 03 17:29:38 2013 +0200
@@ -50,7 +50,7 @@
 	/* open mailbox */
 	box = mailbox_alloc(ns->list, mailbox, flags);
 	if (mailbox_open(box) < 0) {
-		client_send_storage_error(cmd, mailbox_get_storage(box));
+		client_send_box_error(cmd, box);
 		mailbox_free(&box);
 		return TRUE;
 	}
diff -r 21d96c97f519 -r 9946079253c4 src/imap/cmd-select.c
--- a/src/imap/cmd-select.c	Tue Dec 03 17:17:03 2013 +0200
+++ b/src/imap/cmd-select.c	Tue Dec 03 17:29:38 2013 +0200
@@ -233,10 +233,8 @@
 	}
 
 	ret = imap_fetch_end(ctx->fetch_ctx);
-	if (ret < 0) {
-		client_send_storage_error(ctx->cmd,
-					  mailbox_get_storage(ctx->box));
-	}
+	if (ret < 0)
+		client_send_box_error(ctx->cmd, ctx->box);
 	imap_fetch_free(&ctx->fetch_ctx);
 	cmd_select_finish(ctx, ret);
 	return TRUE;
@@ -302,8 +300,7 @@
 		flags |= MAILBOX_FLAG_DROP_RECENT;
 	ctx->box = mailbox_alloc(ctx->ns->list, mailbox, flags);
 	if (mailbox_open(ctx->box) < 0) {
-		client_send_storage_error(ctx->cmd,
-					  mailbox_get_storage(ctx->box));
+		client_send_box_error(ctx->cmd, ctx->box);
 		mailbox_free(&ctx->box);
 		return -1;
 	}
@@ -312,8 +309,7 @@
 		ret = mailbox_enable(ctx->box, client->enabled_features);
 	if (ret < 0 ||
 	    mailbox_sync(ctx->box, MAILBOX_SYNC_FLAG_FULL_READ) < 0) {
-		client_send_storage_error(ctx->cmd,
-					  mailbox_get_storage(ctx->box));
+		client_send_box_error(ctx->cmd, ctx->box);
 		return -1;
 	}
 	mailbox_get_open_status(ctx->box, STATUS_MESSAGES | STATUS_RECENT |
@@ -363,8 +359,7 @@
 	if (ctx->qresync_uid_validity == status.uidvalidity &&
 	    status.uidvalidity != 0) {
 		if ((ret = select_qresync(ctx)) < 0) {
-			client_send_storage_error(ctx->cmd,
-				mailbox_get_storage(ctx->box));
+			client_send_box_error(ctx->cmd, ctx->box);
 			return -1;
 		}
 	} else {
diff -r 21d96c97f519 -r 9946079253c4 src/imap/cmd-setmetadata.c
--- a/src/imap/cmd-setmetadata.c	Tue Dec 03 17:17:03 2013 +0200
+++ b/src/imap/cmd-setmetadata.c	Tue Dec 03 17:29:38 2013 +0200
@@ -244,9 +244,9 @@
 	if (ret < 0 || ctx->cmd_error_sent)
 		/* already sent the error to client */ ;
 	else if (ctx->storage_failure)
-		client_send_storage_error(cmd, mailbox_get_storage(ctx->box));
+		client_send_box_error(cmd, ctx->box);
 	else if (mailbox_transaction_commit(&ctx->trans) < 0)
-		client_send_storage_error(cmd, mailbox_get_storage(ctx->box));
+		client_send_box_error(cmd, ctx->box);
 	else
 		client_send_tagline(cmd, "OK Setmetadata completed.");
 	cmd_setmetadata_deinit(ctx);
@@ -301,8 +301,7 @@
 	else {
 		ctx->box = mailbox_alloc(ns->list, mailbox, 0);
 		if (mailbox_open(ctx->box) < 0) {
-			client_send_storage_error(cmd,
-				mailbox_get_storage(ctx->box));
+			client_send_box_error(cmd, ctx->box);
 			mailbox_free(&ctx->box);
 			return TRUE;
 		}
diff -r 21d96c97f519 -r 9946079253c4 src/imap/cmd-store.c
--- a/src/imap/cmd-store.c	Tue Dec 03 17:17:03 2013 +0200
+++ b/src/imap/cmd-store.c	Tue Dec 03 17:29:38 2013 +0200
@@ -109,8 +109,7 @@
 		if (mailbox_keywords_create(cmd->client->mailbox, keywords_list,
 					    &ctx->keywords) < 0) {
 			/* invalid keywords */
-			client_send_storage_error(cmd,
-				mailbox_get_storage(cmd->client->mailbox));
+			client_send_box_error(cmd, cmd->client->mailbox);
 			return FALSE;
 		}
 	}
@@ -211,8 +210,7 @@
 		ret = mailbox_transaction_commit(&t);
 	if (ret < 0) {
 		array_free(&modified_set);
-		client_send_storage_error(cmd,
-			mailbox_get_storage(client->mailbox));
+		client_send_box_error(cmd, client->mailbox);
 		return TRUE;
 	}
 
diff -r 21d96c97f519 -r 9946079253c4 src/imap/cmd-subscribe.c
--- a/src/imap/cmd-subscribe.c	Tue Dec 03 17:17:03 2013 +0200
+++ b/src/imap/cmd-subscribe.c	Tue Dec 03 17:29:38 2013 +0200
@@ -12,7 +12,7 @@
 	int ret;
 
 	if ((ret = mailbox_exists(box, TRUE, &existence)) < 0) {
-		client_send_storage_error(cmd, mailbox_get_storage(box));
+		client_send_box_error(cmd, box);
 		return FALSE;
 	}
 	if (existence == MAILBOX_EXISTENCE_NONE) {
@@ -71,7 +71,7 @@
 
 	if (mailbox_set_subscribed(box, subscribe) < 0 &&
 	    !unsubscribed_mailbox2) {
-		client_send_storage_error(cmd, mailbox_get_storage(box));
+		client_send_box_error(cmd, box);
 	} else {
 		client_send_tagline(cmd, subscribe ?
 				    "OK Subscribe completed." :
diff -r 21d96c97f519 -r 9946079253c4 src/imap/cmd-thread.c
--- a/src/imap/cmd-thread.c	Tue Dec 03 17:17:03 2013 +0200
+++ b/src/imap/cmd-thread.c	Tue Dec 03 17:29:38 2013 +0200
@@ -283,8 +283,7 @@
 		ret = imap_thread_orderedsubject(cmd, sargs);
 	mail_search_args_unref(&sargs);


More information about the dovecot-cvs mailing list