From a266f28f1c35e555b570879b1655eb470e0d33b5 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Sat, 19 Mar 2011 22:12:55 +0100 Subject: [PATCH] cancel submitted commands when canceling store we already have some minimal asynchronicity, so there might be commands in flight when a fatal error comes in. --- src/drv_imap.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/drv_imap.c b/src/drv_imap.c index f37456f..8b3b98d 100644 --- a/src/drv_imap.c +++ b/src/drv_imap.c @@ -283,6 +283,21 @@ submit_imap_cmd( imap_store_t *ctx, struct imap_cmd *cmd, const char *fmt, ... ) return ret; } +static void +cancel_submitted_imap_cmds( imap_store_t *ctx ) +{ + struct imap_cmd *cmd; + + while ((cmd = ctx->in_progress)) { + ctx->in_progress = cmd->next; + /* don't update num_in_progress and in_progress_append - store is dead */ + cmd->param.done( ctx, cmd, RESP_CANCEL ); + free( cmd->param.data ); + free( cmd->cmd ); + free( cmd ); + } +} + static int imap_exec( imap_store_t *ctx, struct imap_cmd *cmdp, void (*done)( imap_store_t *ctx, struct imap_cmd *cmd, int response ), @@ -927,6 +942,7 @@ imap_cancel_store( store_t *gctx ) imap_store_t *ctx = (imap_store_t *)gctx; socket_close( &ctx->conn ); + cancel_submitted_imap_cmds( ctx ); free_generic_messages( ctx->gen.msgs ); free_string_list( ctx->gen.boxes ); free_list( ctx->ns_personal );