dovecot-2.2: dsync: Make sure when fixing mailbox names we don't...

dovecot at dovecot.org dovecot at dovecot.org
Tue Feb 3 18:27:59 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/6a74968f7978
changeset: 18218:6a74968f7978
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Feb 03 20:27:49 2015 +0200
description:
dsync: Make sure when fixing mailbox names we don't try to change the namespace prefix.
Although in normal installations this it wouldn't have happened in any case.

diffstat:

 src/doveadm/dsync/dsync-brain-mailbox-tree.c |  56 ++++++++++++++++------------
 1 files changed, 32 insertions(+), 24 deletions(-)

diffs (95 lines):

diff -r 9bec5721d277 -r 6a74968f7978 src/doveadm/dsync/dsync-brain-mailbox-tree.c
--- a/src/doveadm/dsync/dsync-brain-mailbox-tree.c	Tue Feb 03 20:23:52 2015 +0200
+++ b/src/doveadm/dsync/dsync-brain-mailbox-tree.c	Tue Feb 03 20:27:49 2015 +0200
@@ -180,59 +180,67 @@
 }
 
 static void
-dsync_fix_mailbox_name(struct mail_namespace *ns, string_t *vname,
+dsync_fix_mailbox_name(struct mail_namespace *ns, string_t *vname_str,
 		       char alt_char)
 {
 	const char *old_vname;
-	char *p, list_sep = mailbox_list_get_hierarchy_sep(ns->list);
+	char *vname, list_sep = mailbox_list_get_hierarchy_sep(ns->list);
 	guid_128_t guid;
+	unsigned int i, start_pos;
+
+	vname = str_c_modifiable(vname_str);
+	if (strncmp(vname, ns->prefix, ns->prefix_len) == 0)
+		start_pos = ns->prefix_len;
+	else
+		start_pos = 0;
 
 	/* replace control chars */
-	for (p = str_c_modifiable(vname); *p != '\0'; p++) {
-		if ((unsigned char)*p < ' ')
-			*p = alt_char;
+	for (i = start_pos; vname[i] != '\0'; i++) {
+		if ((unsigned char)vname[i] < ' ')
+			vname[i] = alt_char;
 	}
 	/* make it valid UTF8 */
-	if (!uni_utf8_str_is_valid(str_c(vname))) {
-		old_vname = t_strdup(str_c(vname));
-		str_truncate(vname, 0);
+	if (!uni_utf8_str_is_valid(vname)) {
+		old_vname = t_strdup(vname + start_pos);
+		str_truncate(vname_str, start_pos);
 		if (uni_utf8_get_valid_data((const void *)old_vname,
-					    strlen(old_vname), vname))
+					    strlen(old_vname), vname_str))
 			i_unreached();
+		vname = str_c_modifiable(vname_str);
 	}
-	if (dsync_is_valid_name(ns, str_c(vname)))
+	if (dsync_is_valid_name(ns, vname))
 		return;
 
 	/* 1) change any real separators to alt separators (this wouldn't
 	   be necessary with listescape, but don't bother detecting it) */
 	if (list_sep != mail_namespace_get_sep(ns)) {
-		for (p = str_c_modifiable(vname); *p != '\0'; p++) {
-			if (*p == list_sep)
-				*p = alt_char;
+		for (i = start_pos; vname[i] != '\0'; i++) {
+			if (vname[i] == list_sep)
+				vname[i] = alt_char;
 		}
-		if (dsync_is_valid_name(ns, str_c(vname)))
+		if (dsync_is_valid_name(ns, vname))
 			return;
 	}
 	/* 2) '/' characters aren't valid without listescape */
 	if (mail_namespace_get_sep(ns) != '/' && list_sep != '/') {
-		for (p = str_c_modifiable(vname); *p != '\0'; p++) {
-			if (*p == '/')
-				*p = alt_char;
+		for (i = start_pos; vname[i] != '\0'; i++) {
+			if (vname[i] == '/')
+				vname[i] = alt_char;
 		}
-		if (dsync_is_valid_name(ns, str_c(vname)))
+		if (dsync_is_valid_name(ns, vname))
 			return;
 	}
 	/* 3) probably some reserved name (e.g. dbox-Mails) */
-	str_insert(vname, ns->prefix_len, "_");
-	if (dsync_is_valid_name(ns, str_c(vname)))
+	str_insert(vname_str, ns->prefix_len, "_");
+	if (dsync_is_valid_name(ns, str_c(vname_str)))
 		return;
 
 	/* 4) name is too long? just give up and generate a unique name */
 	guid_128_generate(guid);
-	str_truncate(vname, 0);
-	str_append(vname, ns->prefix);
-	str_append(vname, guid_128_to_string(guid));
-	i_assert(dsync_is_valid_name(ns, str_c(vname)));
+	str_truncate(vname_str, 0);
+	str_append(vname_str, ns->prefix);
+	str_append(vname_str, guid_128_to_string(guid));
+	i_assert(dsync_is_valid_name(ns, str_c(vname_str)));
 }
 
 static int


More information about the dovecot-cvs mailing list