]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dsync: Fix potential crash when handling mailbox renames
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 17 Oct 2024 09:15:08 +0000 (12:15 +0300)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Thu, 17 Oct 2024 12:29:48 +0000 (12:29 +0000)
Fixes:
Panic: file dsync-mailbox-tree-sync.c: line 575 (node_mailbox_trees_cmp): assertion failed: (ret != 0)

src/doveadm/dsync/dsync-mailbox-tree-sync.c
src/doveadm/dsync/test-dsync-mailbox-tree-sync.c

index 3b21764663abf3f32ae723ca9991ce9d528ea5c8..cf49c4e0baaa2df07fa27da25eedbfa5b75fcb28 100644 (file)
@@ -802,8 +802,8 @@ sync_find_branch(struct dsync_mailbox_tree *tree,
        for (node = dir_node->first_child; node != NULL; node = node->next) {
                if (dsync_mailbox_node_is_dir(node)) {
                        other_node = sync_find_branch(tree, other_tree, node);
-                       if (other_node != NULL)
-                               return other_node;
+                       if (other_node != NULL && other_node->parent != NULL)
+                               return other_node->parent;
                } else {
                        guid_p = node->mailbox_guid;
                        other_node = hash_table_lookup(other_tree->guid_hash,
index 62b48e288aabaf1eaa94844c9c2e8a088a0748c4..53230e81d5b5c2848022b5251d5717bb2c6c6544 100644 (file)
@@ -741,6 +741,43 @@ static void test_dsync_mailbox_tree_sync_renames22(void)
        test_end();
 }
 
+static void test_dsync_mailbox_tree_sync_renames23(void)
+{
+       struct dsync_mailbox_tree *tree1, *tree2;
+
+       test_begin("dsync mailbox tree sync renames 23");
+       tree1 = dsync_mailbox_tree_init('/', '\0', '_');
+       tree2 = dsync_mailbox_tree_init('/', '\0', '_');
+
+       node_create(tree1, 2, "p1/a/c", 0);
+       node_create(tree1, 3, "p2/a/c", 0);
+
+       node_create(tree2, 4, "p2/b/d", 0);
+       node_create(tree2, 2, "p1", 0);
+
+       test_trees(tree1, tree2);
+       test_end();
+}
+
+static void test_dsync_mailbox_tree_sync_renames24(void)
+{
+       struct dsync_mailbox_tree *tree1, *tree2;
+
+       test_begin("dsync mailbox tree sync renames 24");
+       tree1 = dsync_mailbox_tree_init('/', '\0', '_');
+       tree2 = dsync_mailbox_tree_init('/', '\0', '_');
+
+       node_create(tree1, 1, "p1/a", 0);
+       node_create(tree1, 2, "p1/a/c", 0);
+       node_create(tree1, 3, "p2/a/c", 0);
+
+       node_create(tree2, 4, "p2/b/d", 0);
+       node_create(tree2, 2, "p1", 0);
+
+       test_trees(tree1, tree2);
+       test_end();
+}
+
 static void test_dsync_mailbox_tree_sync_random(void)
 {
        struct dsync_mailbox_tree *tree1, *tree2;
@@ -779,6 +816,8 @@ int main(void)
                test_dsync_mailbox_tree_sync_renames20,
                test_dsync_mailbox_tree_sync_renames21,
                test_dsync_mailbox_tree_sync_renames22,
+               test_dsync_mailbox_tree_sync_renames23,
+               test_dsync_mailbox_tree_sync_renames24,
                test_dsync_mailbox_tree_sync_random,
                NULL
        };