dovecot-2.2: layout=fs: Renaming non-UTF8 mailbox names wasn't d...
dovecot at dovecot.org
dovecot at dovecot.org
Sun May 20 03:26:29 EEST 2012
details: http://hg.dovecot.org/dovecot-2.2/rev/c77fbfce438d
changeset: 14360:c77fbfce438d
user: Timo Sirainen <tss at iki.fi>
date: Mon Mar 19 15:53:25 2012 +0200
description:
layout=fs: Renaming non-UTF8 mailbox names wasn't done in all situations.
diffstat:
src/lib-storage/list/mailbox-list-fs-iter.c | 67 ++++++++++++++--------------
1 files changed, 34 insertions(+), 33 deletions(-)
diffs (98 lines):
diff -r 063cd2a15056 -r c77fbfce438d src/lib-storage/list/mailbox-list-fs-iter.c
--- a/src/lib-storage/list/mailbox-list-fs-iter.c Fri Mar 16 18:48:46 2012 +0200
+++ b/src/lib-storage/list/mailbox-list-fs-iter.c Mon Mar 19 15:53:25 2012 +0200
@@ -85,6 +85,33 @@
return 0;
}
+static void
+fs_list_rename_invalid(struct fs_list_iterate_context *ctx,
+ const char *storage_name)
+{
+ /* the storage_name is completely invalid, rename it to
+ something more sensible. we could do this for all names that
+ aren't valid mUTF-7, but that might lead to accidents in
+ future when UTF-8 storage names are used */
+ string_t *destname = t_str_new(128);
+ string_t *dest = t_str_new(128);
+ const char *root, *src;
+
+ root = mailbox_list_get_path(ctx->ctx.list, NULL,
+ MAILBOX_LIST_PATH_TYPE_MAILBOX);
+ src = t_strconcat(root, "/", storage_name, NULL);
+
+ (void)uni_utf8_get_valid_data((const void *)storage_name,
+ strlen(storage_name), destname);
+
+ str_append(dest, root);
+ str_append_c(dest, '/');
+ (void)imap_utf8_to_utf7(str_c(destname), dest);
+
+ if (rename(src, str_c(dest)) < 0 && errno != ENOENT)
+ i_error("rename(%s, %s) failed: %m", src, str_c(dest));
+}
+
static int
dir_entry_get(struct fs_list_iterate_context *ctx, const char *dir_path,
struct list_dir_context *dir, const struct dirent *d)
@@ -120,6 +147,13 @@
storage_name = *dir->storage_name == '\0' ? d->d_name :
t_strconcat(dir->storage_name, "/", d->d_name, NULL);
vname = mailbox_list_get_vname(ctx->ctx.list, storage_name);
+ if (!uni_utf8_str_is_valid(vname)) {
+ fs_list_rename_invalid(ctx, storage_name);
+ /* just skip this in this iteration, we'll see it on the
+ next list */
+ return 0;
+ }
+
match = imap_match(ctx->ctx.glob, vname);
if ((dir->info_flags & (MAILBOX_CHILDREN | MAILBOX_NOCHILDREN |
@@ -512,33 +546,6 @@
return strcmp(path, inbox_path) == 0;
}
-static void
-fs_list_rename_invalid(struct fs_list_iterate_context *ctx,
- const char *storage_name)
-{
- /* the storage_name is completely invalid, rename it to
- something more sensible. we could do this for all names that
- aren't valid mUTF-7, but that might lead to accidents in
- future when UTF-8 storage names are used */
- string_t *destname = t_str_new(128);
- string_t *dest = t_str_new(128);
- const char *root, *src;
-
- root = mailbox_list_get_path(ctx->ctx.list, NULL,
- MAILBOX_LIST_PATH_TYPE_MAILBOX);
- src = t_strconcat(root, "/", storage_name, NULL);
-
- (void)uni_utf8_get_valid_data((const void *)storage_name,
- strlen(storage_name), destname);
-
- str_append(dest, root);
- str_append_c(dest, '/');
- (void)imap_utf8_to_utf7(str_c(destname), dest);
-
- if (rename(src, str_c(dest)) < 0 && errno != ENOENT)
- i_error("rename(%s, %s) failed: %m", src, str_c(dest));
-}
-
static int
fs_list_entry(struct fs_list_iterate_context *ctx,
const struct list_dir_entry *entry)
@@ -553,12 +560,6 @@
t_strconcat(dir->storage_name, "/", entry->fname, NULL);
vname = mailbox_list_get_vname(ctx->ctx.list, storage_name);
- if (!uni_utf8_str_is_valid(vname)) {
- fs_list_rename_invalid(ctx, storage_name);
- /* just skip this in this iteration, we'll see it on the
- next list */
- return 0;
- }
ctx->info.name = p_strdup(ctx->info_pool, vname);
ctx->info.flags = entry->info_flags;
More information about the dovecot-cvs
mailing list