]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Memory leak fixup.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 5 Mar 2009 08:19:52 +0000 (08:19 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 5 Mar 2009 08:19:52 +0000 (08:19 +0000)
git-svn-id: file:///svn/unbound/trunk@1512 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
services/mesh.c

index 76746b4f7a6143fa2e9a9c25817fe719efd6d4c7..da5814ab8802a2e0debe8beeb0a0e5dfa3850ab0 100644 (file)
@@ -1,3 +1,6 @@
+5 March 2009: Wouter
+       - fixup memory leak introduced on 18feb in mesh reentrant fix.
+
 3 March 2009: Wouter
        - combined icon with 16x16(4) 32x32(4) 48x48(8) 64x64(8).
        - service works on xp/vista, no config necessary (using defaults).
index 10619e5552da7ee6c3ec498dc55e3cac9aec2a11..b1afec0c4c81b897019ddde851600ba0b95b37c7 100644 (file)
@@ -188,13 +188,15 @@ mesh_create(struct module_stack* stack, struct module_env* env)
 
 /** help mesh delete delete mesh states */
 static void
-mesh_delete_helper(rbnode_t* n, void* ATTR_UNUSED(arg))
+mesh_delete_helper(rbnode_t* n)
 {
        struct mesh_state* mstate = (struct mesh_state*)n->key;
        /* perform a full delete, not only 'cleanup' routine,
         * because other callbacks expect a clean state in the mesh.
         * For 're-entrant' calls */
        mesh_state_delete(&mstate->s);
+       /* but because these delete the items from the tree, postorder
+        * traversal and rbtree rebalancing do not work together */
 }
 
 void 
@@ -203,7 +205,8 @@ mesh_delete(struct mesh_area* mesh)
        if(!mesh)
                return;
        /* free all query states */
-       traverse_postorder(&mesh->all, &mesh_delete_helper, NULL);
+       while(mesh->all.count)
+               mesh_delete_helper(mesh->all.root);
        timehist_delete(mesh->histogram);
        free(mesh);
 }
@@ -212,7 +215,8 @@ void
 mesh_delete_all(struct mesh_area* mesh)
 {
        /* free all query states */
-       traverse_postorder(&mesh->all, &mesh_delete_helper, NULL);
+       while(mesh->all.count)
+               mesh_delete_helper(mesh->all.root);
        mesh->stats_dropped += mesh->num_reply_addrs;
        /* clear mesh area references */
        rbtree_init(&mesh->run, &mesh_state_compare);