]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap: Fixed URLFETCH assert-crashes due to output_cmd_lock not being cleared.
authorTimo Sirainen <tss@iki.fi>
Mon, 6 May 2013 17:15:58 +0000 (20:15 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 6 May 2013 17:15:58 +0000 (20:15 +0300)
src/imap/cmd-urlfetch.c

index 86f1d0511520ea5e2374de1d7bfd0d743006511e..d8c2e7f9df0c6ea67e93d2dde5b88311ea7af003 100644 (file)
@@ -43,7 +43,14 @@ static void cmd_urlfetch_finish(struct client_command_context *cmd)
                imap_urlauth_fetch_deinit(&ctx->ufetch);
 
        if (ctx->failed) {
-               client_send_internal_error(cmd);
+               if (cmd->client->output_cmd_lock == cmd) {
+                       /* failed in the middle of a literal.
+                          we need to disconnect. */
+                       cmd->client->output_cmd_lock = NULL;
+                       client_disconnect(cmd->client, "URLFETCH failed");
+               } else {
+                       client_send_internal_error(cmd);
+               }
                return;
        }
 
@@ -147,12 +154,12 @@ static bool cmd_urlfetch_continue(struct client_command_context *cmd)
                client_send_line(client, ")");
        else
                client_send_line(client, "");
+       client->output_cmd_lock = NULL;
 
        if (imap_urlauth_fetch_continue(ctx->ufetch)) {
                /* waiting for imap urlauth service */
                cmd->state = CLIENT_COMMAND_STATE_WAIT_EXTERNAL;
                cmd->func = cmd_urlfetch_cancel;
-               client->output_cmd_lock = NULL;
 
                /* retrieve next url */
                return FALSE;