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