From dbcfa2e797ff2eb0e9b69eaba648ae0f50452600 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Wed, 30 Dec 2009 04:43:02 +0100
Subject: [PATCH] Imap4flags extension: fixed bug in removeflag: removing a
 single flag failed due to off-by-one error.

---
 .../imap4flags/ext-imap4flags-common.c        | 22 ++++++++++++++-----
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c b/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c
index 41077a084..8cfa3ba12 100644
--- a/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c
+++ b/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c
@@ -307,24 +307,34 @@ const char *ext_imap4flags_iter_get_flag
 	const unsigned char *fbegin;
 	const unsigned char *fstart;
 	const unsigned char *fend;
-	
+
+	/* Return if no more flags are available */	
 	if ( iter->offset >= len ) return NULL;
 	
+	/* Mark string boundries */
 	fbegin = str_data(iter->flags_list);
-	fp = fbegin + iter->offset;
-	fstart = fp;
 	fend = fbegin + len;
+
+	/* Start of this flag */
+	fstart = fbegin + iter->offset;
+
+	/* Scan for next flag */
+	fp = fstart;
 	for (;;) {
-		if ( fp >= fend || *fp == ' ' ) { 
+		/* Have we reached the end or a flag boundary? */
+		if ( fp >= fend || *fp == ' ' ) {
+			/* Did we scan more than nothing ? */
 			if ( fp > fstart ) {
+				/* Return flag */
 				const char *flag = t_strdup_until(fstart, fp);
 				
 				iter->last = fstart - fbegin;
 				iter->offset = fp - fbegin;
+
 				return flag;
 			} 	
 			
-			fstart = fp+1;
+			fstart = fp + 1;
 		}
 		
 		if ( fp >= fend ) break;
@@ -343,7 +353,7 @@ static void ext_imap4flags_iter_delete_last
 	iter->offset++;
 	if ( iter->offset > str_len(iter->flags_list) )
 		iter->offset = str_len(iter->flags_list);
-	if ( iter->offset == str_len(iter->flags_list) )
+	if ( iter->offset == str_len(iter->flags_list) && iter->last > 0 )
 		iter->last--;
 
 	str_delete(iter->flags_list, iter->last, iter->offset - iter->last);	
-- 
GitLab