dovecot-2.2: imap: Don't leak mailboxes on CATENATE errors.

dovecot at dovecot.org dovecot at dovecot.org
Sun Feb 24 16:02:57 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/514b8fc1e278
changeset: 15915:514b8fc1e278
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Feb 24 16:02:47 2013 +0200
description:
imap: Don't leak mailboxes on CATENATE errors.

diffstat:

 src/imap/cmd-append.c |  49 +++++++++++++++++++++++++++++--------------------
 1 files changed, 29 insertions(+), 20 deletions(-)

diffs (87 lines):

diff -r 12f12add18d2 -r 514b8fc1e278 src/imap/cmd-append.c
--- a/src/imap/cmd-append.c	Sun Feb 24 15:26:53 2013 +0200
+++ b/src/imap/cmd-append.c	Sun Feb 24 16:02:47 2013 +0200
@@ -156,31 +156,15 @@
 }
 
 static int
-cmd_append_catenate_url(struct client_command_context *cmd, const char *caturl)
+cmd_append_catenate_mpurl(struct client_command_context *cmd,
+			  const char *caturl, struct imap_msgpart_url *mpurl)
 {
 	struct cmd_append_context *ctx = cmd->context;
-	struct imap_msgpart_url *mpurl;
 	struct imap_msgpart_open_result mpresult;
 	uoff_t newsize;
 	const char *error;
 	int ret;
 
-	if (ctx->failed)
-		return -1;
-
-	ret = imap_msgpart_url_parse(cmd->client->user, cmd->client->mailbox,
-				     caturl, &mpurl, &error);
-	if (ret < 0) {
-		client_send_storage_error(cmd, ctx->storage);
-		return -1;
-	}
-	if (ret == 0) {
-		/* invalid url, abort */
-		client_send_tagline(cmd,
-			t_strdup_printf("NO [BADURL %s] %s.", caturl, error));
-		return -1;
-	}
-
 	/* catenate URL */
 	ret = imap_msgpart_url_read_part(mpurl, &mpresult, &error);
 	if (ret < 0) {
@@ -195,7 +179,6 @@
 	}
 	if (mpresult.size == 0) {
 		/* empty input */
-		imap_msgpart_url_free(&mpurl);
 		return 0;
 	}
 
@@ -203,7 +186,6 @@
 	if (newsize < ctx->cat_msg_size) {
 		client_send_tagline(cmd,
 			"NO [TOOBIG] Composed message grows too big.");
-		imap_msgpart_url_free(&mpurl);
 		return -1;
 	}
 
@@ -235,6 +217,33 @@
 		i_assert(!i_stream_have_bytes_left(mpresult.input));
 		ret = 0;
 	}
+	return ret;
+}
+
+static int
+cmd_append_catenate_url(struct client_command_context *cmd, const char *caturl)
+{
+	struct cmd_append_context *ctx = cmd->context;
+	struct imap_msgpart_url *mpurl;
+	const char *error;
+	int ret;
+
+	if (ctx->failed)
+		return -1;
+
+	ret = imap_msgpart_url_parse(cmd->client->user, cmd->client->mailbox,
+				     caturl, &mpurl, &error);
+	if (ret < 0) {
+		client_send_storage_error(cmd, ctx->storage);
+		return -1;
+	}
+	if (ret == 0) {
+		/* invalid url, abort */
+		client_send_tagline(cmd,
+			t_strdup_printf("NO [BADURL %s] %s.", caturl, error));
+		return -1;
+	}
+	ret = cmd_append_catenate_mpurl(cmd, caturl, mpurl);
 	imap_msgpart_url_free(&mpurl);
 	return ret;
 }


More information about the dovecot-cvs mailing list