dovecot: If mail_get_stream() succeeds but mail_get_*_size() fai...

dovecot at dovecot.org dovecot at dovecot.org
Sat Dec 22 03:05:34 EET 2007


details:   http://hg.dovecot.org/dovecot/rev/ebdd050c0a58
changeset: 7022:ebdd050c0a58
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Dec 22 02:53:20 2007 +0200
description:
If mail_get_stream() succeeds but mail_get_*_size() fails, we didn't
reference the stream so we must not unreference it later either.

diffstat:

1 file changed, 10 insertions(+), 9 deletions(-)
src/imap/imap-fetch-body.c |   19 ++++++++++---------

diffs (50 lines):

diff -r c4f4fa03e14e -r ebdd050c0a58 src/imap/imap-fetch-body.c
--- a/src/imap/imap-fetch-body.c	Sat Dec 22 02:52:39 2007 +0200
+++ b/src/imap/imap-fetch-body.c	Sat Dec 22 02:53:20 2007 +0200
@@ -323,21 +323,22 @@ static int fetch_body(struct imap_fetch_
 		      const struct imap_fetch_body_data *body)
 {
 	const struct message_size *fetch_size;
+	struct istream *input;
 	struct message_size hdr_size, body_size;
 
 	if (body->section[0] == '\0') {
-		if (mail_get_stream(mail, NULL, NULL, &ctx->cur_input) < 0)
-			return -1;
-		if (mail_get_virtual_size(mail, &body_size.virtual_size) < 0 ||
+		if (mail_get_stream(mail, NULL, NULL, &input) < 0 ||
+		    mail_get_virtual_size(mail, &body_size.virtual_size) < 0 ||
 		    mail_get_physical_size(mail, &body_size.physical_size) < 0)
 			return -1;
 	} else {
 		if (mail_get_stream(mail, &hdr_size,
 				    body->section[0] == 'H' ? NULL : &body_size,
-				    &ctx->cur_input) < 0)
+				    &input) < 0)
 			return -1;
 	}
 
+	ctx->cur_input = input;
 	i_stream_ref(ctx->cur_input);
 	ctx->update_partial = TRUE;
 
@@ -872,14 +873,14 @@ static int fetch_rfc822(struct imap_fetc
 {
 	struct message_size size;
 	const char *str;
-
-	if (mail_get_stream(mail, NULL, NULL, &ctx->cur_input) < 0)
-		return -1;
-
-	if (mail_get_virtual_size(mail, &size.virtual_size) < 0 ||
+	struct istream *input;
+
+	if (mail_get_stream(mail, NULL, NULL, &input) < 0 ||
+	    mail_get_virtual_size(mail, &size.virtual_size) < 0 ||
 	    mail_get_physical_size(mail, &size.physical_size) < 0)
 		return -1;
 
+	ctx->cur_input = input;
 	i_stream_ref(ctx->cur_input);
 	ctx->update_partial = FALSE;
 


More information about the dovecot-cvs mailing list