Mercurial > dovecot > core-2.2
changeset 13694:466badb63c0b
maildir: When noticing invalid 'S' in filename, replace it with the correct one instead of removing it.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 15 Nov 2011 00:05:50 +0200 |
parents | a538eec53922 |
children | 3c5d3d618c76 |
files | src/lib-storage/index/maildir/maildir-mail.c |
diffstat | 1 files changed, 12 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-mail.c Mon Nov 14 23:15:37 2011 +0200 +++ b/src/lib-storage/index/maildir/maildir-mail.c Tue Nov 15 00:05:50 2011 +0200 @@ -617,6 +617,7 @@ const char *wrong_key_p) { const char *fname, *newpath, *extra, *info, *dir; + struct stat st; fname = strrchr(path, '/'); i_assert(fname != NULL); @@ -627,8 +628,17 @@ info = strchr(fname, MAILDIR_INFO_SEP); if (info == NULL) info = ""; - newpath = t_strdup_printf("%s/%s%s", dir, - t_strdup_until(fname, extra), info); + if (stat(path, &st) < 0) { + if (errno == ENOENT) + return 0; + mail_storage_set_critical(&mbox->storage->storage, + "stat(%s) failed: %m", path); + return -1; + } + + newpath = t_strdup_printf("%s/%s,S=%"PRIuUOFF_T"%s", dir, + t_strdup_until(fname, extra), + (uoff_t)st.st_size, info); if (rename(path, newpath) == 0) { mail_storage_set_critical(mbox->box.storage,