]> git.ipfire.org Git - people/ms/libloc.git/commitdiff
tree: More elegantly prevent deleting the root node
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 17 Jul 2023 16:13:35 +0000 (16:13 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 17 Jul 2023 16:13:35 +0000 (16:13 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/network.c

index 1fce8b100ff05d73b28fd019f13c974d193de4df..12d0b5971592aac4d73fa85c732417c1875bac51 100644 (file)
@@ -1193,7 +1193,8 @@ ERROR:
        return r;
 }
 
-static int loc_network_tree_delete_node(struct loc_network_tree_node** node) {
+static int loc_network_tree_delete_node(struct loc_network_tree* tree,
+               struct loc_network_tree_node** node) {
        struct loc_network_tree_node* n = *node;
        int r0 = 1;
        int r1 = 1;
@@ -1204,14 +1205,14 @@ static int loc_network_tree_delete_node(struct loc_network_tree_node** node) {
 
        // Delete zero
        if (n->zero) {
-               r0 = loc_network_tree_delete_node(&n->zero);
+               r0 = loc_network_tree_delete_node(tree, &n->zero);
                if (r0 < 0)
                        return r0;
        }
 
        // Delete one
        if (n->one) {
-               r1 = loc_network_tree_delete_node(&n->one);
+               r1 = loc_network_tree_delete_node(tree, &n->one);
                if (r1 < 0)
                        return r1;
        }
@@ -1224,6 +1225,10 @@ static int loc_network_tree_delete_node(struct loc_network_tree_node** node) {
        if (!r0 || !r1)
                return 0;
 
+       // Don't delete root
+       if (tree->root == n)
+               return 0;
+
 DELETE:
        // It is now safe to delete the node
        loc_network_tree_node_unref(n);
@@ -1235,13 +1240,10 @@ DELETE:
 static int loc_network_tree_delete_nodes(struct loc_network_tree* tree) {
        int r;
 
-       r = loc_network_tree_delete_node(&tree->root);
+       r = loc_network_tree_delete_node(tree, &tree->root);
        if (r < 0)
                return r;
 
-       // Undelete the root node in case the entire tree got deleted
-       tree->root->deleted = 0;
-
        return 0;
 }