From 7eb0f6c02f2d0d662e77bf7c126ff3664c7a50b1 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 18 May 2017 17:36:27 +0300 Subject: [PATCH] lib-imap-client: Avoid infinite reconnection loops when retrying command fails reconnect_command_count wasn't calculated correctly, because the SELECT and potentially other following sync commands weren't included in it. --- src/lib-imap-client/imapc-client.h | 4 +++- src/lib-imap-client/imapc-connection.c | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib-imap-client/imapc-client.h b/src/lib-imap-client/imapc-client.h index 54dadbdff8..03afe4f752 100644 --- a/src/lib-imap-client/imapc-client.h +++ b/src/lib-imap-client/imapc-client.h @@ -52,7 +52,9 @@ enum imapc_command_flags { finishes. */ IMAPC_COMMAND_FLAG_RETRIABLE = 0x04, /* This is the LOGOUT command. Use a small timeout for it. */ - IMAPC_COMMAND_FLAG_LOGOUT = 0x08 + IMAPC_COMMAND_FLAG_LOGOUT = 0x08, + /* Command is being resent after a reconnection. */ + IMAPC_COMMAND_FLAG_RECONNECTED = 0x10 }; enum imapc_client_ssl_mode { diff --git a/src/lib-imap-client/imapc-connection.c b/src/lib-imap-client/imapc-connection.c index 6eaf1ab93c..7e71b333c1 100644 --- a/src/lib-imap-client/imapc-connection.c +++ b/src/lib-imap-client/imapc-connection.c @@ -300,6 +300,7 @@ imapc_connection_abort_commands_array(ARRAY_TYPE(imapc_command) *cmd_array, (cmd->flags & IMAPC_COMMAND_FLAG_RETRIABLE) != 0) { cmd->send_pos = 0; cmd->wait_for_literal = 0; + cmd->flags |= IMAPC_COMMAND_FLAG_RECONNECTED; i++; } else { array_delete(cmd_array, i, 1); @@ -1435,7 +1436,7 @@ static int imapc_connection_input_tagged(struct imapc_connection *conn) } if (conn->reconnect_command_count > 0 && - (cmd->flags & IMAPC_COMMAND_FLAG_PRELOGIN) == 0) { + (cmd->flags & IMAPC_COMMAND_FLAG_RECONNECTED) != 0) { if (--conn->reconnect_command_count == 0) { /* we've received replies for all the commands started before reconnection. if we get disconnected now, we -- 2.47.3