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