]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap-urlfetch: Don't leak memory on error. Use TCP corking when sending data.
authorTimo Sirainen <tss@iki.fi>
Sun, 19 May 2013 16:51:34 +0000 (19:51 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 19 May 2013 16:51:34 +0000 (19:51 +0300)
src/imap/cmd-urlfetch.c

index 5ddfb5fffeee16bb8b2da591d1405a714690da91..2826cb0fc1d06603127b1c99bd3ee3b1e619a4b4 100644 (file)
@@ -258,20 +258,14 @@ cmd_urlfetch_url_callback(struct imap_urlauth_fetch_reply *reply,
        struct cmd_urlfetch_context *ctx = cmd->context;
        int ret;
 
+       o_stream_cork(cmd->client->output);
        if (reply == NULL) {
                /* fatal failure */
-               last = TRUE;
                ctx->failed = TRUE;
+               ret = -1;
        } else if (reply->succeeded) {
                /* URL fetch succeeded */
                ret = cmd_urlfetch_url_sucess(cmd, reply);
-               if (ret == 0)
-                       return 0;
-               if (ret < 0) {
-                       ctx->ufetch = NULL;
-                       cmd_urlfetch_finish(cmd);
-                       return -1;
-               }
        } else {
                /* URL fetch failed */
                string_t *response = t_str_new(128);
@@ -284,14 +278,17 @@ cmd_urlfetch_url_callback(struct imap_urlauth_fetch_reply *reply,
                        client_send_line(cmd->client, t_strdup_printf(
                                "* NO %s.", reply->error));
                }
+               ret = 1;
        }
+       o_stream_uncork(cmd->client->output);
 
-       if (last && cmd->state == CLIENT_COMMAND_STATE_WAIT_EXTERNAL) {
+       if ((last && cmd->state == CLIENT_COMMAND_STATE_WAIT_EXTERNAL) ||
+           ret < 0) {
                ctx->ufetch = NULL;
                cmd_urlfetch_finish(cmd);
                client_command_free(&cmd);
        }
-       return 1;
+       return ret;
 }
 
 static int