dovecot-2.2: dsync: Added assert to make sure namespace prefix i...

dovecot at dovecot.org dovecot at dovecot.org
Thu Feb 5 17:36:39 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/560043558dd6
changeset: 18220:560043558dd6
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Feb 05 19:36:29 2015 +0200
description:
dsync: Added assert to make sure namespace prefix isn't attempted to be renamed.
This can happen, I'm just not sure how exactly.. The previous behavior
caused assert-crashes also, this change just makes it happen earlier.

diffstat:

 src/doveadm/dsync/dsync-mailbox-tree-sync.c      |  18 ++++++++++++++++++
 src/doveadm/dsync/test-dsync-mailbox-tree-sync.c |   5 +++++
 2 files changed, 23 insertions(+), 0 deletions(-)

diffs (50 lines):

diff -r 00a57ac1b9fa -r 560043558dd6 src/doveadm/dsync/dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/dsync-mailbox-tree-sync.c	Thu Feb 05 19:20:17 2015 +0200
+++ b/src/doveadm/dsync/dsync-mailbox-tree-sync.c	Thu Feb 05 19:36:29 2015 +0200
@@ -357,6 +357,22 @@
 	return node_has_existent_children(node, TRUE);
 }
 
+static bool sync_node_is_namespace_prefix(struct dsync_mailbox_tree *tree,
+					  struct dsync_mailbox_node *node)
+{
+	const char *full_name;
+	unsigned int prefix_len = node->ns->prefix_len;
+
+	if (prefix_len == 0)
+		return FALSE;
+
+	full_name = dsync_mailbox_node_get_full_name(tree, node);
+	if (node->ns->prefix[prefix_len-1] == mail_namespace_get_sep(node->ns))
+		prefix_len--;
+	return strncmp(full_name, node->ns->prefix, prefix_len) == 0 &&
+		full_name[prefix_len] == '\0';
+}
+
 static void
 sync_rename_node_to_temp(struct dsync_mailbox_tree_sync_ctx *ctx,
 			 struct dsync_mailbox_tree *tree,
@@ -369,6 +385,8 @@
 	buffer_t buf;
 	unsigned int prefix_len, max_prefix_len, counter = 1;
 
+	i_assert(!sync_node_is_namespace_prefix(tree, node));
+
 	buffer_create_from_data(&buf, name, sizeof(name));
 	max_prefix_len = TEMP_MAX_NAME_LEN - TEMP_SUFFIX_MAX_LEN - 1;
 	if (node->sync_temporary_name) {
diff -r 00a57ac1b9fa -r 560043558dd6 src/doveadm/dsync/test-dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/test-dsync-mailbox-tree-sync.c	Thu Feb 05 19:20:17 2015 +0200
+++ b/src/doveadm/dsync/test-dsync-mailbox-tree-sync.c	Thu Feb 05 19:36:29 2015 +0200
@@ -12,6 +12,11 @@
 
 #define MAX_DEPTH 4
 
+char mail_namespace_get_sep(struct mail_namespace *ns ATTR_UNUSED)
+{
+	return '/';
+}
+
 void mailbox_name_get_sha128(const char *name, guid_128_t guid_128_r)
 {
 	unsigned char sha[SHA1_RESULTLEN];


More information about the dovecot-cvs mailing list