From dfc3a20b33f265b54746c9c2768b997d5e1cf15e Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sun, 19 May 2013 19:51:34 +0300 Subject: [PATCH] imap-urlfetch: Don't leak memory on error. Use TCP corking when sending data. --- src/imap/cmd-urlfetch.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/imap/cmd-urlfetch.c b/src/imap/cmd-urlfetch.c index 5ddfb5fffe..2826cb0fc1 100644 --- a/src/imap/cmd-urlfetch.c +++ b/src/imap/cmd-urlfetch.c @@ -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 -- 2.47.3