From: Timo Sirainen Date: Thu, 23 Oct 2014 00:10:12 +0000 (+0300) Subject: lib-storage: Make sure mailbox names are valid UTF-8 with LAYOUT=index X-Git-Tag: 2.2.15~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=483268a37cd0421bc50f6b4c322e11c557c4cecd;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Make sure mailbox names are valid UTF-8 with LAYOUT=index --- diff --git a/src/lib-storage/list/mailbox-list-index.c b/src/lib-storage/list/mailbox-list-index.c index 4c243ee2b7..0bd4bd1f23 100644 --- a/src/lib-storage/list/mailbox-list-index.c +++ b/src/lib-storage/list/mailbox-list-index.c @@ -169,15 +169,18 @@ void mailbox_list_index_node_unlink(struct mailbox_list_index *ilist, static int mailbox_list_index_parse_header(struct mailbox_list_index *ilist, struct mail_index_view *view) { - const void *data, *p; + const void *data, *name_start, *p; size_t i, len, size; uint32_t id, prev_id = 0; + string_t *str; char *name; + int ret = 0; mail_index_map_get_header_ext(view, view->map, ilist->ext_id, &data, &size); if (size == 0) return 0; + str = t_str_new(128); for (i = sizeof(struct mailbox_list_index_header); i < size; ) { /* get id */ if (i + sizeof(id) > size) @@ -195,11 +198,18 @@ static int mailbox_list_index_parse_header(struct mailbox_list_index *ilist, p = memchr(CONST_PTR_OFFSET(data, i), '\0', size-i); if (p == NULL) return -1; - len = (const char *)p - - (const char *)(CONST_PTR_OFFSET(data, i)); + name_start = CONST_PTR_OFFSET(data, i); + len = (const char *)p - (const char *)name_start; + + if (uni_utf8_get_valid_data(name_start, len, str)) { + name = p_strndup(ilist->mailbox_pool, name_start, len); + } else { + /* corrupted index. fix the name. */ + name = p_strdup(ilist->mailbox_pool, str_c(str)); + str_truncate(str, 0); + ret = -1; + } - name = p_strndup(ilist->mailbox_pool, - CONST_PTR_OFFSET(data, i), len); i += len + 1; /* add id => name to hash table */ @@ -207,7 +217,7 @@ static int mailbox_list_index_parse_header(struct mailbox_list_index *ilist, ilist->highest_name_id = id; } i_assert(i == size); - return 0; + return ret; } static void