# HG changeset patch # User Timo Sirainen # Date 1243202952 14400 # Node ID d77225a6412873528b3c94abe8268436df5dbe82 # Parent 995d501d8f4160eded830db995de8899f8c3529c IMAP: Make sure pending syncs are done before a mailbox-changing command is run. diff -r 995d501d8f41 -r d77225a64128 src/imap/client.c --- a/src/imap/client.c Fri May 22 18:26:24 2009 -0400 +++ b/src/imap/client.c Sun May 24 18:09:12 2009 -0400 @@ -370,13 +370,14 @@ static struct client_command_context * client_command_find_with_flags(struct client_command_context *new_cmd, - enum command_flags flags) + enum command_flags flags, + enum client_command_state max_state) { struct client_command_context *cmd; cmd = new_cmd->client->command_queue; for (; cmd != NULL; cmd = cmd->next) { - if (cmd->state < CLIENT_COMMAND_STATE_WAIT_SYNC && + if (cmd->state <= max_state && cmd != new_cmd && (cmd->cmd_flags & flags) != 0) return cmd; } @@ -386,6 +387,8 @@ static bool client_command_check_ambiguity(struct client_command_context *cmd) { enum command_flags flags; + enum client_command_state max_state = + CLIENT_COMMAND_STATE_WAIT_UNAMBIGUITY; bool broken_client = FALSE; if ((cmd->cmd_flags & COMMAND_FLAG_BREAKS_MAILBOX) == @@ -393,6 +396,7 @@ /* there must be no other command running that uses the selected mailbox */ flags = COMMAND_FLAG_USES_MAILBOX; + max_state = CLIENT_COMMAND_STATE_DONE; } else if ((cmd->cmd_flags & COMMAND_FLAG_USES_SEQS) != 0) { /* no existing command must be breaking sequences */ flags = COMMAND_FLAG_BREAKS_SEQS; @@ -404,7 +408,7 @@ return FALSE; } - if (client_command_find_with_flags(cmd, flags) == NULL) { + if (client_command_find_with_flags(cmd, flags, max_state) == NULL) { if (cmd->client->syncing) { /* don't do anything until syncing is finished */ return TRUE;