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