Mercurial > dovecot > original-hg > dovecot-1.2
changeset 3467:b75125eced7f HEAD
Moved sequence set range checks to imap-specific code, so that SEARCH can
accept sequence sets with sequence being larger than number of messages in
mailbox.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 04 Jul 2005 00:09:40 +0300 |
parents | c058c73776cc |
children | 3e1d7dffb3a2 |
files | src/imap/imap-search.c src/lib-storage/index/index-search.c |
diffstat | 2 files changed, 19 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/imap-search.c Sun Jul 03 23:53:50 2005 +0300 +++ b/src/imap/imap-search.c Mon Jul 04 00:09:40 2005 +0300 @@ -413,16 +413,18 @@ return first_sarg; } -static int imap_search_get_msgset_arg(pool_t pool, const char *messageset, +static int imap_search_get_msgset_arg(struct client_command_context *cmd, + const char *messageset, struct mail_search_arg **arg_r, const char **error_r) { struct mail_search_arg *arg; - arg = p_new(pool, struct mail_search_arg, 1); + arg = p_new(cmd->pool, struct mail_search_arg, 1); arg->type = SEARCH_SEQSET; - arg->value.seqset = imap_messageset_parse(pool, messageset); - if (arg->value.seqset == NULL) { + arg->value.seqset = imap_messageset_parse(cmd->pool, messageset); + if (arg->value.seqset == NULL || + arg->value.seqset->seq2 > cmd->client->messages_count) { *error_r = "Invalid messageset"; return -1; } @@ -452,8 +454,7 @@ int ret; if (!uid) { - ret = imap_search_get_msgset_arg(cmd->pool, set, - &search_arg, &error); + ret = imap_search_get_msgset_arg(cmd, set, &search_arg, &error); } else { ret = imap_search_get_uidset_arg(cmd->pool, cmd->client->mailbox, set,
--- a/src/lib-storage/index/index-search.c Sun Jul 03 23:53:50 2005 +0300 +++ b/src/lib-storage/index/index-search.c Mon Jul 04 00:09:40 2005 +0300 @@ -536,14 +536,21 @@ uint32_t *seq1_r, uint32_t *seq2_r) { for (; set != NULL; set = set->next) { - if (set->seq1 == (uint32_t)-1) + if (set->seq1 > hdr->messages_count) { + if (set->seq1 != (uint32_t)-1 && + set->seq2 != (uint32_t)-1) { + /* completely outside our range */ + set->seq1 = set->seq2 = 0; + return 0; + } + /* either seq1 or seq2 is '*', so the last message is + in range. */ set->seq1 = hdr->messages_count; - if (set->seq2 == (uint32_t)-1) + } + if (set->seq2 > hdr->messages_count) set->seq2 = hdr->messages_count; - if (set->seq1 == 0 || set->seq2 == 0 || - set->seq1 > hdr->messages_count || - set->seq2 > hdr->messages_count) { + if (set->seq1 == 0 || set->seq2 == 0) { mail_storage_set_syntax_error(ibox->box.storage, "Invalid messageset"); return -1;