dovecot-1.0: mbox: Fixed a crash when adding a new X-IMAPbase: h...

dovecot at dovecot.org dovecot at dovecot.org
Fri Jun 20 11:07:30 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.0/rev/18c47a9277d5
changeset: 5557:18c47a9277d5
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jun 20 11:07:25 2008 +0300
description:
mbox: Fixed a crash when adding a new X-IMAPbase: header with keywords.

diffstat:

1 file changed, 10 insertions(+), 6 deletions(-)
src/lib-storage/index/mbox/mbox-sync-update.c |   16 ++++++++++------

diffs (61 lines):

diff -r 92c3d6e64f2a -r 18c47a9277d5 src/lib-storage/index/mbox/mbox-sync-update.c
--- a/src/lib-storage/index/mbox/mbox-sync-update.c	Wed Jun 18 03:26:37 2008 +0300
+++ b/src/lib-storage/index/mbox/mbox-sync-update.c	Fri Jun 20 11:07:25 2008 +0300
@@ -148,7 +148,8 @@ static void keywords_append(struct mbox_
 }
 
 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;
@@ -156,8 +157,8 @@ keywords_append_all(struct mbox_sync_mai
 	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--) {
@@ -181,7 +182,7 @@ keywords_append_all(struct mbox_sync_mai
 
 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);
@@ -198,6 +199,9 @@ static void mbox_sync_add_missing_header
 
 		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);
 
@@ -207,7 +211,7 @@ static void mbox_sync_add_missing_header
 		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');
 	}
 
@@ -357,7 +361,7 @@ static void mbox_sync_update_x_imap_base
 	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);


More information about the dovecot-cvs mailing list