From: Timo Sirainen Date: Wed, 24 Sep 2014 21:40:48 +0000 (+0300) Subject: imapc: If connection isn't in selected state when deleting mailbox, don't try to... X-Git-Tag: 2.2.14.rc1~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf684c50bc1c85994e9c65ebf5269fbd18daaa64;p=thirdparty%2Fdovecot%2Fcore.git imapc: If connection isn't in selected state when deleting mailbox, don't try to UNSELECT it. --- diff --git a/src/lib-imap-client/imapc-client.h b/src/lib-imap-client/imapc-client.h index 456c76059d..191db2ea62 100644 --- a/src/lib-imap-client/imapc-client.h +++ b/src/lib-imap-client/imapc-client.h @@ -146,11 +146,13 @@ imapc_client_cmd(struct imapc_client *client, imapc_command_callback_t *callback, void *context); void imapc_command_set_flags(struct imapc_command *cmd, enum imapc_command_flags flags); +bool imapc_command_connection_is_selected(struct imapc_command *cmd); void imapc_command_send(struct imapc_command *cmd, const char *cmd_str); void imapc_command_sendf(struct imapc_command *cmd, const char *cmd_fmt, ...) ATTR_FORMAT(2, 3); void imapc_command_sendvf(struct imapc_command *cmd, const char *cmd_fmt, va_list args) ATTR_FORMAT(2, 0); +void imapc_command_abort(struct imapc_command **cmd); void imapc_client_register_untagged(struct imapc_client *client, imapc_untagged_callback_t *callback, diff --git a/src/lib-imap-client/imapc-connection.c b/src/lib-imap-client/imapc-connection.c index bbf716043e..34f3eb21b2 100644 --- a/src/lib-imap-client/imapc-connection.c +++ b/src/lib-imap-client/imapc-connection.c @@ -1481,6 +1481,14 @@ static void imapc_command_free(struct imapc_command *cmd) pool_unref(&cmd->pool); } +void imapc_command_abort(struct imapc_command **_cmd) +{ + struct imapc_command *cmd = *_cmd; + + *_cmd = NULL; + imapc_command_free(cmd); +} + static void imapc_command_timeout(struct imapc_connection *conn) { struct imapc_command *const *cmds; @@ -1780,6 +1788,12 @@ void imapc_command_set_mailbox(struct imapc_command *cmd, box->pending_box_command_count++; } +bool imapc_command_connection_is_selected(struct imapc_command *cmd) +{ + return cmd->conn->selected_box != NULL || + cmd->conn->selecting_box != NULL; +} + void imapc_command_send(struct imapc_command *cmd, const char *cmd_str) { unsigned int len = strlen(cmd_str); diff --git a/src/lib-storage/index/imapc/imapc-list.c b/src/lib-storage/index/imapc/imapc-list.c index 9ec6febdbe..e8ead79328 100644 --- a/src/lib-storage/index/imapc/imapc-list.c +++ b/src/lib-storage/index/imapc/imapc-list.c @@ -800,12 +800,16 @@ imapc_list_delete_mailbox(struct mailbox_list *_list, const char *name) capa = imapc_client_get_capabilities(list->client->client); cmd = imapc_list_simple_context_init(&ctx, list); - imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_SELECT); - if ((capa & IMAPC_CAPABILITY_UNSELECT) != 0) - imapc_command_sendf(cmd, "UNSELECT"); - else - imapc_command_sendf(cmd, "SELECT \"~~~\""); - imapc_simple_run(&ctx); + if (!imapc_command_connection_is_selected(cmd)) + imapc_command_abort(&cmd); + else { + imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_SELECT); + if ((capa & IMAPC_CAPABILITY_UNSELECT) != 0) + imapc_command_sendf(cmd, "UNSELECT"); + else + imapc_command_sendf(cmd, "SELECT \"~~~\""); + imapc_simple_run(&ctx); + } cmd = imapc_list_simple_context_init(&ctx, list); imapc_command_sendf(cmd, "DELETE %s", name);