dovecot-2.2: imap: Fixed MULTIAPPEND CATENATE that contained onl...

dovecot at dovecot.org dovecot at dovecot.org
Thu Aug 30 18:45:00 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/e4c09527aa9e
changeset: 14985:e4c09527aa9e
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Aug 30 18:44:43 2012 +0300
description:
imap: Fixed MULTIAPPEND CATENATE that contained only URLs

diffstat:

 src/imap/cmd-append.c |  46 ++++++++++++++++++++++------------------------
 1 files changed, 22 insertions(+), 24 deletions(-)

diffs (96 lines):

diff -r 09de25ccacb4 -r e4c09527aa9e src/imap/cmd-append.c
--- a/src/imap/cmd-append.c	Wed Aug 29 23:16:05 2012 +0300
+++ b/src/imap/cmd-append.c	Thu Aug 30 18:44:43 2012 +0300
@@ -416,7 +416,7 @@
 
 static int
 cmd_append_handle_args(struct client_command_context *cmd,
-		       const struct imap_arg **args, bool *nonsync_r)
+		       const struct imap_arg *args, bool *nonsync_r)
 {
 	struct client *client = cmd->client;
 	struct cmd_append_context *ctx = cmd->context;
@@ -432,26 +432,26 @@
 	bool valid;
 
 	/* [<flags>] */
-	if (!imap_arg_get_list(*args, &flags_list))
+	if (!imap_arg_get_list(args, &flags_list))
 		flags_list = NULL;
 	else
-		(*args)++;
+		args++;
 
 	/* [<internal date>] */
-	if ((*args)->type != IMAP_ARG_STRING)
+	if (args->type != IMAP_ARG_STRING)
 		internal_date_str = NULL;
 	else {
-		internal_date_str = imap_arg_as_astring(*args);
-		(*args)++;
+		internal_date_str = imap_arg_as_astring(args);
+		args++;
 	}
 
 	/* <message literal> | CATENATE (..) */
 	valid = FALSE;
 	*nonsync_r = FALSE;
 	ctx->catenate = FALSE;
-	if (imap_arg_atom_equals(*args, "CATENATE")) {
-		(*args)++;
-		if (imap_arg_get_list(*args, &cat_list)) {
+	if (imap_arg_atom_equals(args, "CATENATE")) {
+		args++;
+		if (imap_arg_get_list(args, &cat_list)) {
 			valid = TRUE;
 			ctx->catenate = TRUE;
 		}
@@ -461,11 +461,13 @@
 		ctx->binary_input = imap_arg_atom_equals(&cat_list[0], "TEXT") &&
 			cat_list[1].literal8;
 
-	} else if (imap_arg_get_literal_size(*args, &ctx->literal_size)) {
-		*nonsync_r = (*args)->type == IMAP_ARG_LITERAL_SIZE_NONSYNC;
-		ctx->binary_input = (*args)->literal8;
+	} else if (imap_arg_get_literal_size(args, &ctx->literal_size)) {
+		*nonsync_r = args->type == IMAP_ARG_LITERAL_SIZE_NONSYNC;
+		ctx->binary_input = args->literal8;
 		valid = TRUE;
 	}
+	/* we parsed the args only up to here. */
+	i_assert(IMAP_ARG_IS_EOL(&args[1]));
 
 	if (!valid) {
 		client->input_skip_line = TRUE;
@@ -691,23 +693,19 @@
 		return cmd_append_finish_parsing(cmd);
 	}
 
-	/* Handle one or more messages (MULTIAPPEND) while they only contain
-	   CATENATE URLs (i.e. no TEXT input from client) */
-	while ((ret = cmd_append_handle_args(cmd, &args, &nonsync)) == 0) {
-		cmd_append_finish_catenate(cmd);
-
-		args++;
-		if (IMAP_ARG_IS_EOL(args)) {
-			/* last message */
-			return cmd_append_finish_parsing(cmd);
-		}
-	}
-
+	ret = cmd_append_handle_args(cmd, args, &nonsync);
 	if (ret < 0) {
 		/* invalid parameters, abort immediately */
 		cmd_append_finish(ctx);
 		return TRUE;
 	}
+	if (ret == 0) {
+		/* CATENATE contained only URLs. Finish it and see if there
+		   are more messsages. */
+		cmd_append_finish_catenate(cmd);
+		imap_parser_reset(ctx->save_parser);
+		return cmd_append_parse_new_msg(cmd);
+	}
 
 	if (!ctx->catenate) {
 		/* after literal comes CRLF, if we fail make sure


More information about the dovecot-cvs mailing list