free IMAP command's payload prior to invoking its completion callback

otherwise the synching may livelock due to failing to schedule follow-up
commands, thinking the buffers are still full. of course, this is
relevant only for commands that failed early and thus didn't free the
payload right after submission already - which will be possible only
after the next commit.
This commit is contained in:
Oswald Buddenhagen 2022-06-19 11:19:34 +02:00
parent 1225f0b86b
commit 5e5c7fb508

View File

@ -288,11 +288,13 @@ done_imap_cmd( imap_store_t *ctx, imap_cmd_t *cmd, int response )
{ {
if (cmd->param.wait_check) if (cmd->param.wait_check)
ctx->num_wait_check--; ctx->num_wait_check--;
cmd->param.done( ctx, cmd, response );
if (cmd->param.data) { if (cmd->param.data) {
free( cmd->param.data ); free( cmd->param.data );
cmd->param.data = NULL;
// This needs to happen before calling back.
ctx->buffer_mem -= cmd->param.data_len; ctx->buffer_mem -= cmd->param.data_len;
} }
cmd->param.done( ctx, cmd, response );
free( cmd->cmd ); free( cmd->cmd );
free( cmd ); free( cmd );
} }