# HG changeset patch # User Timo Sirainen # Date 1213949241 -10800 # Node ID 5dcc04b62e14676b11a468a49a48e0297cb841bb # Parent 96b8f50c9eeafc2178692e4d27f6bbe7567d3228 mbox: Fixed a crash when adding a new X-IMAPbase: header with keywords. diff -r 96b8f50c9eea -r 5dcc04b62e14 src/lib-storage/index/mbox/mbox-sync-update.c --- a/src/lib-storage/index/mbox/mbox-sync-update.c Thu Jun 19 01:41:42 2008 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync-update.c Fri Jun 20 11:07:21 2008 +0300 @@ -149,7 +149,8 @@ } static void -keywords_append_all(struct mbox_sync_mail_context *ctx, string_t *dest) +keywords_append_all(struct mbox_sync_mail_context *ctx, string_t *dest, + size_t startpos) { const char *const *names; const unsigned char *p; @@ -157,8 +158,8 @@ size_t last_break; p = str_data(dest); - if (str_len(dest) < KEYWORD_WRAP_LINE_LENGTH) - last_break = 0; + if (str_len(dest) - startpos < KEYWORD_WRAP_LINE_LENGTH) + last_break = startpos; else { /* set last_break to beginning of line */ for (last_break = str_len(dest); last_break > 0; last_break--) { @@ -182,7 +183,7 @@ static void mbox_sync_add_missing_headers(struct mbox_sync_mail_context *ctx) { - size_t old_hdr_size, new_hdr_size; + size_t old_hdr_size, new_hdr_size, startpos; old_hdr_size = ctx->body_offset - ctx->hdr_offset; new_hdr_size = str_len(ctx->header); @@ -199,6 +200,9 @@ str_append(ctx->header, "X-IMAPbase: "); ctx->hdr_pos[MBOX_HDR_X_IMAPBASE] = str_len(ctx->header); + /* startpos must start from identical position as when + updating */ + startpos = str_len(ctx->header); str_printfa(ctx->header, "%u ", ctx->sync_ctx->base_uid_validity); @@ -208,7 +212,7 @@ ctx->imapbase_updated = TRUE; str_printfa(ctx->header, "%010u", ctx->last_uid_updated_value); - keywords_append_all(ctx, ctx->header); + keywords_append_all(ctx, ctx->header, startpos); str_append_c(ctx->header, '\n'); } @@ -355,7 +359,7 @@ ctx->imapbase_updated = TRUE; str_printfa(str, "%010u", ctx->last_uid_updated_value); - keywords_append_all(ctx, str); + keywords_append_all(ctx, str, 0); str_append_c(str, '\n'); mbox_sync_update_line(ctx, ctx->hdr_pos[MBOX_HDR_X_IMAPBASE], str);