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