Skip to content
Snippets Groups Projects
Commit dbcfa2e7 authored by Stephan Bosch's avatar Stephan Bosch
Browse files

Imap4flags extension: fixed bug in removeflag: removing a single flag failed...

Imap4flags extension: fixed bug in removeflag: removing a single flag failed due to off-by-one error.
parent 59cf3adf
No related branches found
No related tags found
No related merge requests found
...@@ -307,24 +307,34 @@ const char *ext_imap4flags_iter_get_flag ...@@ -307,24 +307,34 @@ const char *ext_imap4flags_iter_get_flag
const unsigned char *fbegin; const unsigned char *fbegin;
const unsigned char *fstart; const unsigned char *fstart;
const unsigned char *fend; const unsigned char *fend;
/* Return if no more flags are available */
if ( iter->offset >= len ) return NULL; if ( iter->offset >= len ) return NULL;
/* Mark string boundries */
fbegin = str_data(iter->flags_list); fbegin = str_data(iter->flags_list);
fp = fbegin + iter->offset;
fstart = fp;
fend = fbegin + len; fend = fbegin + len;
/* Start of this flag */
fstart = fbegin + iter->offset;
/* Scan for next flag */
fp = fstart;
for (;;) { 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 ) { if ( fp > fstart ) {
/* Return flag */
const char *flag = t_strdup_until(fstart, fp); const char *flag = t_strdup_until(fstart, fp);
iter->last = fstart - fbegin; iter->last = fstart - fbegin;
iter->offset = fp - fbegin; iter->offset = fp - fbegin;
return flag; return flag;
} }
fstart = fp+1; fstart = fp + 1;
} }
if ( fp >= fend ) break; if ( fp >= fend ) break;
...@@ -343,7 +353,7 @@ static void ext_imap4flags_iter_delete_last ...@@ -343,7 +353,7 @@ static void ext_imap4flags_iter_delete_last
iter->offset++; iter->offset++;
if ( iter->offset > str_len(iter->flags_list) ) if ( iter->offset > str_len(iter->flags_list) )
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--; iter->last--;
str_delete(iter->flags_list, iter->last, iter->offset - iter->last); str_delete(iter->flags_list, iter->last, iter->offset - iter->last);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment

Consent

On this website, we use the web analytics service Matomo to analyze and review the use of our website. Through the collected statistics, we can improve our offerings and make them more appealing for you. Here, you can decide whether to allow us to process your data and set corresponding cookies for these purposes, in addition to technically necessary cookies. Further information on data protection—especially regarding "cookies" and "Matomo"—can be found in our privacy policy. You can withdraw your consent at any time.