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;