Mercurial > dovecot > original-hg > dovecot-1.2
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) &&