diff src/lib-storage/index/maildir/maildir-sync.c @ 4450:14b10f7ea70e HEAD

Don't break if mailbox path contains ':' characters.
author Timo Sirainen <tss@iki.fi>
date Wed, 28 Jun 2006 01:51:47 +0300
parents 5cbabd4ccd9c
children 1a35d53c18fc
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-sync.c	Wed Jun 28 01:20:32 2006 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync.c	Wed Jun 28 01:51:47 2006 +0300
@@ -400,7 +400,7 @@
 {
         struct maildir_index_sync_context *ctx = context;
 	const struct mail_index_sync_rec *recs;
-	const char *newpath;
+	const char *dir, *fname, *newfname, *newpath;
 	enum mail_flags flags;
 	array_t ARRAY_DEFINE(keywords, unsigned int);
 	unsigned int i, count;
@@ -408,9 +408,14 @@
 
 	ctx->dirty_state = 0;
 
+	fname = strrchr(path, '/');
+	i_assert(fname != NULL);
+	fname++;
+	dir = t_strdup_until(path, fname);
+
 	ARRAY_CREATE(&keywords, pool_datastack_create(), unsigned int, 16);
 	(void)maildir_filename_get_flags(ctx->keywords_sync_ctx,
-					 path, &flags, &keywords);
+					 fname, &flags, &keywords);
 	flags8 = flags;
 
 	recs = array_get_modifyable(&ctx->sync_recs, &count);
@@ -434,8 +439,10 @@
 		}
 	}
 
-	newpath = maildir_filename_set_flags(ctx->keywords_sync_ctx,
-					     path, flags8, &keywords);
+
+	newfname = maildir_filename_set_flags(ctx->keywords_sync_ctx,
+					      fname, flags8, &keywords);
+	newpath = t_strconcat(dir, newfname, NULL);
 	if (rename(path, newpath) == 0) {
 		if ((flags8 & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0)
 			ctx->dirty_state = -1;