dovecot-2.2: imapc: Fixed crashes during mailbox close.

dovecot at dovecot.org dovecot at dovecot.org
Fri Aug 10 05:24:41 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/afa918d1c1eb
changeset: 14822:afa918d1c1eb
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Jul 31 23:02:22 2012 +0300
description:
imapc: Fixed crashes during mailbox close.

diffstat:

 src/lib-imap-client/imapc-client.c     |   2 +-
 src/lib-imap-client/imapc-connection.c |  29 +++++++++++++++--------------
 src/lib-imap-client/imapc-connection.h |   3 ++-
 3 files changed, 18 insertions(+), 16 deletions(-)

diffs (104 lines):

diff -r 0abb9b0a54db -r afa918d1c1eb src/lib-imap-client/imapc-client.c
--- a/src/lib-imap-client/imapc-client.c	Tue Jul 31 22:33:21 2012 +0300
+++ b/src/lib-imap-client/imapc-client.c	Tue Jul 31 23:02:22 2012 +0300
@@ -270,7 +270,7 @@
 		/* reopen the mailbox */
 		box->reopen_callback(box->reopen_context);
 	} else {
-		imapc_connection_abort_commands(box->conn, TRUE, FALSE);
+		imapc_connection_abort_commands(box->conn, NULL, FALSE);
 	}
 }
 
diff -r 0abb9b0a54db -r afa918d1c1eb src/lib-imap-client/imapc-connection.c
--- a/src/lib-imap-client/imapc-connection.c	Tue Jul 31 22:33:21 2012 +0300
+++ b/src/lib-imap-client/imapc-connection.c	Tue Jul 31 23:02:22 2012 +0300
@@ -212,6 +212,7 @@
 static void
 imapc_connection_abort_commands_array(ARRAY_TYPE(imapc_command) *cmd_array,
 				      ARRAY_TYPE(imapc_command) *dest_array,
+				      struct imapc_client_mailbox *only_box,
 				      bool keep_retriable)
 {
 	struct imapc_command *const *cmdp, *cmd;
@@ -221,8 +222,10 @@
 		cmdp = array_idx(cmd_array, i);
 		cmd = *cmdp;
 
-		if (keep_retriable &&
-		    (cmd->flags & IMAPC_COMMAND_FLAG_RETRIABLE) != 0) {
+		if (cmd->box != only_box && only_box != NULL)
+			i++;
+		else if (keep_retriable &&
+			 (cmd->flags & IMAPC_COMMAND_FLAG_RETRIABLE) != 0) {
 			cmd->send_pos = 0;
 			cmd->wait_for_literal = 0;
 			i++;
@@ -234,22 +237,20 @@
 }
 
 void imapc_connection_abort_commands(struct imapc_connection *conn,
-				     bool disconnected, bool keep_retriable)
+				     struct imapc_client_mailbox *only_box,
+				     bool keep_retriable)
 {
 	struct imapc_command *const *cmdp, *cmd;
 	ARRAY_TYPE(imapc_command) tmp_array;
 	struct imapc_command_reply reply;
 
 	t_array_init(&tmp_array, 8);
-	if (disconnected) {
-		imapc_connection_abort_commands_array(&conn->cmd_wait_list,
-						      &tmp_array,
-						      keep_retriable);
-	}
-	imapc_connection_abort_commands_array(&conn->cmd_send_queue,
-					      &tmp_array, keep_retriable);
+	imapc_connection_abort_commands_array(&conn->cmd_wait_list, &tmp_array,
+					      only_box, keep_retriable);
+	imapc_connection_abort_commands_array(&conn->cmd_send_queue, &tmp_array,
+					      only_box, keep_retriable);
 
-	if (array_count(&conn->cmd_wait_list) > 0 && disconnected) {
+	if (array_count(&conn->cmd_wait_list) > 0 && only_box == NULL) {
 		/* need to move all the waiting commands to send queue */
 		array_append_array(&conn->cmd_wait_list,
 				   &conn->cmd_send_queue);
@@ -368,13 +369,13 @@
 	conn->fd = -1;
 
 	imapc_connection_set_state(conn, IMAPC_CONNECTION_STATE_DISCONNECTED);
-	imapc_connection_abort_commands(conn, TRUE, reconnecting);
+	imapc_connection_abort_commands(conn, NULL, reconnecting);
 }
 
 static void imapc_connection_set_disconnected(struct imapc_connection *conn)
 {
 	imapc_connection_set_state(conn, IMAPC_CONNECTION_STATE_DISCONNECTED);
-	imapc_connection_abort_commands(conn, TRUE, FALSE);
+	imapc_connection_abort_commands(conn, NULL, FALSE);
 }
 
 static void imapc_connection_reconnect(struct imapc_connection *conn)
@@ -1852,7 +1853,7 @@
 		conn->selecting_box = NULL;
 	}
 	imapc_connection_send_idle_done(conn);
-	imapc_connection_abort_commands(conn, FALSE, FALSE);
+	imapc_connection_abort_commands(conn, box, FALSE);
 }
 
 struct imapc_client_mailbox *
diff -r 0abb9b0a54db -r afa918d1c1eb src/lib-imap-client/imapc-connection.h
--- a/src/lib-imap-client/imapc-connection.h	Tue Jul 31 22:33:21 2012 +0300
+++ b/src/lib-imap-client/imapc-connection.h	Tue Jul 31 23:02:22 2012 +0300
@@ -26,7 +26,8 @@
 			      void *login_context);
 void imapc_connection_disconnect(struct imapc_connection *conn);
 void imapc_connection_abort_commands(struct imapc_connection *conn,
-				     bool disconnected, bool keep_retriable);
+				     struct imapc_client_mailbox *only_box,
+				     bool keep_retriable);
 void imapc_connection_ioloop_changed(struct imapc_connection *conn);
 void imapc_connection_input_pending(struct imapc_connection *conn);
 


More information about the dovecot-cvs mailing list