dovecot-2.1: imapc: Try to avoid crashes on deinit/disconnection.

dovecot at dovecot.org dovecot at dovecot.org
Wed Dec 14 14:29:53 EET 2011


details:   http://hg.dovecot.org/dovecot-2.1/rev/1e8523481d89
changeset: 13862:1e8523481d89
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Dec 14 14:29:07 2011 +0200
description:
imapc: Try to avoid crashes on deinit/disconnection.

diffstat:

 src/lib-imap-client/imapc-client-private.h |  1 +
 src/lib-imap-client/imapc-client.c         |  8 +++++++-
 src/lib-imap-client/imapc-connection.c     |  9 ++++-----
 3 files changed, 12 insertions(+), 6 deletions(-)

diffs (89 lines):

diff -r 46a1f211ef84 -r 1e8523481d89 src/lib-imap-client/imapc-client-private.h
--- a/src/lib-imap-client/imapc-client-private.h	Wed Dec 14 13:50:43 2011 +0200
+++ b/src/lib-imap-client/imapc-client-private.h	Wed Dec 14 14:29:07 2011 +0200
@@ -36,6 +36,7 @@
 
 	bool reconnect_ok;
 	bool reconnecting;
+	bool closing;
 };
 
 void imapc_client_ref(struct imapc_client *client);
diff -r 46a1f211ef84 -r 1e8523481d89 src/lib-imap-client/imapc-client.c
--- a/src/lib-imap-client/imapc-client.c	Wed Dec 14 13:50:43 2011 +0200
+++ b/src/lib-imap-client/imapc-client.c	Wed Dec 14 14:29:07 2011 +0200
@@ -107,6 +107,7 @@
 	struct imapc_client_connection **connp;
 
 	array_foreach_modifiable(&client->conns, connp) {
+		i_assert(imapc_connection_get_mailbox((*connp)->conn) == NULL);
 		imapc_connection_deinit(&(*connp)->conn);
 		i_free(*connp);
 	}
@@ -294,6 +295,8 @@
 	struct imapc_client_mailbox *box = *_box;
 	struct imapc_client_connection *const *connp;
 
+	box->closing = TRUE;
+
 	/* cancel any pending commands */
 	imapc_connection_unselect(box);
 
@@ -324,6 +327,8 @@
 {
 	struct imapc_command *cmd;
 
+	i_assert(!box->closing);
+
 	cmd = imapc_connection_cmd(box->conn, callback, context);
 	imapc_command_set_mailbox(cmd, box);
 	return cmd;
@@ -346,7 +351,8 @@
 {
 	struct imapc_client_mailbox *selected_box;
 
-	if (imapc_connection_get_state(box->conn) != IMAPC_CONNECTION_STATE_DONE)
+	if (box->closing ||
+	    imapc_connection_get_state(box->conn) != IMAPC_CONNECTION_STATE_DONE)
 		return FALSE;
 
 	selected_box = imapc_connection_get_mailbox(box->conn);
diff -r 46a1f211ef84 -r 1e8523481d89 src/lib-imap-client/imapc-connection.c
--- a/src/lib-imap-client/imapc-connection.c	Wed Dec 14 13:50:43 2011 +0200
+++ b/src/lib-imap-client/imapc-connection.c	Wed Dec 14 14:29:07 2011 +0200
@@ -365,14 +365,14 @@
 	net_disconnect(conn->fd);
 	conn->fd = -1;
 
+	imapc_connection_set_state(conn, IMAPC_CONNECTION_STATE_DISCONNECTED);
 	imapc_connection_abort_commands(conn, TRUE, reconnecting);
-	imapc_connection_set_state(conn, IMAPC_CONNECTION_STATE_DISCONNECTED);
 }
 
 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_set_state(conn, IMAPC_CONNECTION_STATE_DISCONNECTED);
 }
 
 static void imapc_connection_reconnect(struct imapc_connection *conn)
@@ -1819,9 +1819,6 @@
 {
 	struct imapc_connection *conn = box->conn;
 
-	imapc_connection_send_idle_done(conn);
-	imapc_connection_abort_commands(conn, FALSE, FALSE);
-
 	if (conn->selected_box != NULL || conn->selecting_box != NULL) {
 		i_assert(conn->selected_box == box ||
 			 conn->selecting_box == box);
@@ -1829,6 +1826,8 @@
 		conn->selected_box = NULL;
 		conn->selecting_box = NULL;
 	}
+	imapc_connection_send_idle_done(conn);
+	imapc_connection_abort_commands(conn, FALSE, FALSE);
 }
 
 struct imapc_client_mailbox *


More information about the dovecot-cvs mailing list