dovecot: Only the first value in a messageset was verified to be...

dovecot at dovecot.org dovecot at dovecot.org
Mon Feb 11 19:58:49 EET 2008


details:   http://hg.dovecot.org/dovecot/rev/0fe19a3d82a3
changeset: 7225:0fe19a3d82a3
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Feb 11 19:58:43 2008 +0200
description:
Only the first value in a messageset was verified to be valid, the rest were
ignored (e.g. 1,100000 passed).

diffstat:

1 file changed, 25 insertions(+), 15 deletions(-)
src/imap/imap-search.c |   40 +++++++++++++++++++++++++---------------

diffs (56 lines):

diff -r d5116fa2c88f -r 0fe19a3d82a3 src/imap/imap-search.c
--- a/src/imap/imap-search.c	Mon Feb 11 17:20:14 2008 +0200
+++ b/src/imap/imap-search.c	Mon Feb 11 19:58:43 2008 +0200
@@ -551,27 +551,37 @@ imap_search_args_build(pool_t pool, stru
 	return first_sarg;
 }
 
-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(cmd->pool, struct mail_search_arg, 1);
-	arg->type = SEARCH_SEQSET;
-	arg->value.seqset = imap_messageset_parse(cmd->pool, messageset);
+static bool
+msgset_is_valid(const struct mail_search_seqset *set, uint32_t messages_count)
+{
 	/* when there are no messages, all messagesets are invalid.
 	   if there's at least one message:
 	    - * gives seq1 = seq2 = (uint32_t)-1
 	    - n:* should work if n <= messages_count
 	    - n:m or m should work if m <= messages_count
 	*/
-	if (arg->value.seqset == NULL || cmd->client->messages_count == 0 ||
-	    (arg->value.seqset->seq1 > cmd->client->messages_count &&
-	     arg->value.seqset->seq1 != (uint32_t)-1) ||
-	    (arg->value.seqset->seq2 > cmd->client->messages_count &&
-	     arg->value.seqset->seq2 != (uint32_t)-1)) {
+	if (set == NULL || messages_count == 0)
+		return FALSE;
+
+	for (; set != NULL; set = set->next) {
+		if ((set->seq1 > messages_count && set->seq1 != (uint32_t)-1) ||
+		    (set->seq2 > messages_count && set->seq2 != (uint32_t)-1))
+			return FALSE;
+	}
+	return TRUE;
+}
+
+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(cmd->pool, struct mail_search_arg, 1);
+	arg->type = SEARCH_SEQSET;
+	arg->value.seqset = imap_messageset_parse(cmd->pool, messageset);
+	if (!msgset_is_valid(arg->value.seqset, cmd->client->messages_count)) {
 		*error_r = "Invalid messageset";
 		return -1;
 	}


More information about the dovecot-cvs mailing list