# HG changeset patch # User Timo Sirainen # Date 1282574306 -3600 # Node ID 7e959d397a3501bb56bf1180d8322042f1a0c639 # Parent cf0da2cd31fb54b998fbbc06d3e3bcf10c639f1d imap: Fixed parsing SELECT QRESYNC parameters diff -r cf0da2cd31fb -r 7e959d397a35 src/imap/cmd-select.c --- a/src/imap/cmd-select.c Fri Aug 20 20:38:26 2010 +0100 +++ b/src/imap/cmd-select.c Mon Aug 23 15:38:26 2010 +0100 @@ -70,7 +70,7 @@ const struct imap_arg *args) { ARRAY_TYPE(seq_range) seqset, uidset; - unsigned int count; + const struct imap_arg *subargs; if ((ctx->cmd->client->enabled_features & MAILBOX_FEATURE_QRESYNC) == 0) { @@ -83,13 +83,8 @@ return FALSE; } args = IMAP_ARG_LIST_ARGS(args); - for (count = 0; args[count].type != IMAP_ARG_EOL; count++) ; - - if (count < 2 || count > 4 || - args[0].type != IMAP_ARG_ATOM || - args[1].type != IMAP_ARG_ATOM || - (count > 2 && args[2].type != IMAP_ARG_ATOM) || - (count > 3 && args[3].type != IMAP_ARG_LIST)) { + if (args[0].type != IMAP_ARG_ATOM || + args[1].type != IMAP_ARG_ATOM) { client_send_command_error(ctx->cmd, "Invalid QRESYNC parameters"); return FALSE; @@ -98,37 +93,40 @@ strtoul(IMAP_ARG_STR_NONULL(&args[0]), NULL, 10); ctx->qresync_modseq = strtoull(IMAP_ARG_STR_NONULL(&args[1]), NULL, 10); - if (count > 2) { + args += 2; + + if (args->type == IMAP_ARG_ATOM) { i_array_init(&ctx->qresync_known_uids, 64); - if (imap_seq_set_parse(IMAP_ARG_STR_NONULL(&args[2]), + if (imap_seq_set_parse(IMAP_ARG_STR_NONULL(args), &ctx->qresync_known_uids) < 0) { client_send_command_error(ctx->cmd, "Invalid QRESYNC known-uids"); return FALSE; } + args++; } else { i_array_init(&ctx->qresync_known_uids, 64); seq_range_array_add_range(&ctx->qresync_known_uids, 1, (uint32_t)-1); } - if (count > 3) { - args = IMAP_ARG_LIST_ARGS(&args[3]); - if (args[0].type != IMAP_ARG_ATOM || - args[1].type != IMAP_ARG_ATOM || - args[2].type != IMAP_ARG_EOL) { + if (args->type == IMAP_ARG_LIST) { + subargs = IMAP_ARG_LIST_ARGS(args); + if (subargs[0].type != IMAP_ARG_ATOM || + subargs[1].type != IMAP_ARG_ATOM || + subargs[2].type != IMAP_ARG_EOL) { client_send_command_error(ctx->cmd, "Invalid QRESYNC known set parameters"); return FALSE; } t_array_init(&seqset, 32); - if (imap_seq_set_parse(IMAP_ARG_STR_NONULL(&args[0]), + if (imap_seq_set_parse(IMAP_ARG_STR_NONULL(&subargs[0]), &seqset) < 0) { client_send_command_error(ctx->cmd, "Invalid QRESYNC known-sequence-set"); return FALSE; } t_array_init(&uidset, 32); - if (imap_seq_set_parse(IMAP_ARG_STR_NONULL(&args[1]), + if (imap_seq_set_parse(IMAP_ARG_STR_NONULL(&subargs[1]), &uidset) < 0) { client_send_command_error(ctx->cmd, "Invalid QRESYNC known-uid-set"); @@ -139,6 +137,12 @@ "Invalid QRESYNC sets"); return FALSE; } + args++; + } + if (args->type != IMAP_ARG_EOL) { + client_send_command_error(ctx->cmd, + "Invalid QRESYNC parameters"); + return FALSE; } return TRUE; }