changeset 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 a2d8624f8f2e
children 1a35d53c18fc
files src/lib-storage/index/maildir/maildir-mail.c src/lib-storage/index/maildir/maildir-sync.c src/lib-storage/index/maildir/maildir-util.c
diffstat 3 files changed, 29 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-mail.c	Wed Jun 28 01:20:32 2006 +0300
+++ b/src/lib-storage/index/maildir/maildir-mail.c	Wed Jun 28 01:51:47 2006 +0300
@@ -121,7 +121,7 @@
 	struct index_mail *mail = (struct index_mail *)_mail;
 	struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;
 	struct index_mail_data *data = &mail->data;
-	const char *fname;
+	const char *path, *fname;
 	uoff_t virtual_size;
         enum maildir_uidlist_rec_flag flags;
 
@@ -142,8 +142,10 @@
 			return (uoff_t)-1;
 		}
 	} else {
-		fname = maildir_save_file_get_path(_mail->transaction,
-						   _mail->seq);
+		path = maildir_save_file_get_path(_mail->transaction,
+						  _mail->seq);
+		fname = strrchr(path, '/');
+		fname = fname != NULL ? fname + 1 : path;
 	}
 
 	/* size can be included in filename */
@@ -163,7 +165,7 @@
 	struct index_mail *mail = (struct index_mail *)_mail;
 	struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;
 	enum maildir_uidlist_rec_flag flags;
-	const char *fname, *end;
+	const char *path, *fname, *end;
 
 	if (field == MAIL_FETCH_UIDL_FILE_NAME) {
 		if (_mail->uid != 0) {
@@ -174,8 +176,10 @@
 				return NULL;
 			}
 		} else {
-			fname = maildir_save_file_get_path(_mail->transaction,
-							   _mail->seq);
+			path = maildir_save_file_get_path(_mail->transaction,
+							  _mail->seq);
+			fname = strrchr(path, '/');
+			fname = fname != NULL ? fname + 1 : path;
 		}
 		end = strchr(fname, MAILDIR_INFO_SEP);
 		return end == NULL ? fname : t_strdup_until(fname, end);
@@ -190,7 +194,7 @@
 	struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;
 	struct index_mail_data *data = &mail->data;
 	struct stat st;
-	const char *fname;
+	const char *path, *fname;
 	uoff_t size;
 	enum maildir_uidlist_rec_flag flags;
 
@@ -206,8 +210,10 @@
 			return (uoff_t)-1;
 		}
 	} else {
-		fname = maildir_save_file_get_path(_mail->transaction,
-						   _mail->seq);
+		path = maildir_save_file_get_path(_mail->transaction,
+						  _mail->seq);
+		fname = strrchr(path, '/');
+		fname = fname != NULL ? fname + 1 : path;
 	}
 
 	/* size can be included in filename */
--- 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;
--- a/src/lib-storage/index/maildir/maildir-util.c	Wed Jun 28 01:20:32 2006 +0300
+++ b/src/lib-storage/index/maildir/maildir-util.c	Wed Jun 28 01:51:47 2006 +0300
@@ -139,6 +139,7 @@
 	uoff_t size = 0;
 
 	for (; *fname != '\0'; fname++) {
+		i_assert(*fname != '/');
 		if (*fname == ',' && fname[1] == type && fname[2] == '=') {
 			fname += 3;
 			break;
@@ -169,6 +170,7 @@
 	unsigned int g, h = 0;
 
 	while (*s != MAILDIR_INFO_SEP && *s != '\0') {
+		i_assert(*s != '/');
 		h = (h << 4) + *s;
 		if ((g = h & 0xf0000000UL)) {
 			h = h ^ (g >> 24);
@@ -186,6 +188,7 @@
 	const char *s1 = p1, *s2 = p2;
 
 	while (*s1 == *s2 && *s1 != MAILDIR_INFO_SEP && *s1 != '\0') {
+		i_assert(*s1 != '/');
 		s1++; s2++;
 	}
 	if ((*s1 == '\0' || *s1 == MAILDIR_INFO_SEP) &&