]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Don't crash on empty node
authorYuri Schaeffer <yuri@nlnetlabs.nl>
Thu, 17 Oct 2013 10:01:03 +0000 (10:01 +0000)
committerYuri Schaeffer <yuri@nlnetlabs.nl>
Thu, 17 Oct 2013 10:01:03 +0000 (10:01 +0000)
git-svn-id: file:///svn/unbound/branches/edns-subnet@2987 be551aaa-1e26-0410-a405-d3ace91eadb9

edns-subnet/addrtree.c
edns-subnet/subnetmod.c
edns-subnet/subnetmod.h
testcode/unitvandergaast.c
util/storage/lruhash.c

index 7e47f9ac163122000b6cd1df50b151c864f0888e..5afb9196330771bdf3bd2c1aea54d82410738484 100644 (file)
@@ -226,7 +226,7 @@ size_t addrtree_size(const struct addrtree *tree)
        if (tree->root->elem) s += tree->sizefunc(tree->root->elem);
        for (n = tree->first; n; n = n->next) {
                s += sizeof (struct addredge) + sizeof (struct addrnode);
-               s += tree->sizefunc(n->elem);
+               if (n->elem) s += tree->sizefunc(n->elem);
        }
        return s;
 }
index ddc0fa103a12945793e5e305e1808083f5d1431a..4ff30757d39e49352232cbe0fb30cd5f1fc8cfd0 100644 (file)
@@ -404,4 +404,9 @@ struct module_func_block *subnetmod_get_funcblock(void)
        return &subnetmod_block;
 }
 
+/** Wrappers for static functions to unit test */
+size_t unittest_wrapper_subnetmod_sizefunc(void *elemptr) {
+       return sizefunc(elemptr);
+}
+
 #endif  /* CLIENT_SUBNET */
index 48b3101888bf4d90167c929d1e4fd556a4231848..33ee815fdf6c48a9f8bf34022dcb8c29d749e10f 100644 (file)
@@ -64,4 +64,8 @@ void subnetmod_clear(struct module_qstate* qstate, int id);
 
 /** subnet module alloc size routine */
 size_t subnetmod_get_mem(struct module_env* env, int id);
+
+/** Wrappers for static functions to unit test */
+size_t unittest_wrapper_subnetmod_sizefunc(void *elemptr);
+
 #endif /* SUBNETMOD_H */
index 85428939d31e9fb56955fa346b5a99ec4c417d52..ac3a9f7eae9967c315a48ab82737e52e96719bb8 100644 (file)
@@ -47,6 +47,7 @@
 #include "util/module.h"
 #include "testcode/unitmain.h"
 #include "edns-subnet/addrtree.h"
+#include "edns-subnet/subnetmod.h"
 
 /*
        void printkey(addrkey_t *k, addrlen_t bits)
@@ -165,7 +166,7 @@ static void consistency_test(void)
        unit_show_func("edns-subnet/addrtree.h", "Tree consistency check");
        srand(9195); /* just some value for reproducibility */
 
-       t = addrtree_create(100, &elemfree, NULL, &env, 0);
+       t = addrtree_create(100, &elemfree, &unittest_wrapper_subnetmod_sizefunc, &env, 0);
        count = t->node_count;
        unit_assert(count == 0);
        for (i = 0; i < 1000; i++) {
@@ -179,9 +180,10 @@ static void consistency_test(void)
                free(k);
                unit_assert( !addrtree_inconsistent(t) );
        }
+       addrtree_size(t);
        addrtree_delete(t);
        unit_show_func("edns-subnet/addrtree.h", "Tree consistency with purge");
-       t = addrtree_create(8, &elemfree, NULL, &env, 0);
+       t = addrtree_create(8, &elemfree, &unittest_wrapper_subnetmod_sizefunc, &env, 0);
        unit_assert(t->node_count == 0);
        for (i = 0; i < 1000; i++) {
                l = randomkey(&k, 128);
@@ -190,9 +192,10 @@ static void consistency_test(void)
                free(k);
                unit_assert( !addrtree_inconsistent(t) );
        }
+       addrtree_size(t);
        addrtree_delete(t);
        unit_show_func("edns-subnet/addrtree.h", "Tree consistency with limit");
-       t = addrtree_create(8, &elemfree, NULL, &env, 27);
+       t = addrtree_create(8, &elemfree, &unittest_wrapper_subnetmod_sizefunc, &env, 27);
        unit_assert(t->node_count == 0);
        for (i = 0; i < 1000; i++) {
                l = randomkey(&k, 128);
@@ -202,6 +205,7 @@ static void consistency_test(void)
                free(k);
                unit_assert( !addrtree_inconsistent(t) );
        }
+       addrtree_size(t);
        addrtree_delete(t);
 }
 
index 560cf9015d51d75178ec8a97d7e18b5b02930a30..e96708b88c1fb144ebf605afc97645c40ee6bad2 100644 (file)
@@ -325,6 +325,7 @@ lruhash_insert(struct lruhash* table, hashvalue_t hash,
                table->space_used += need_size;
        } else {
                /* if so: update data - needs a writelock */
+               /* A+=B-C; works because A will wrap around when B<C */
                table->space_used += need_size -
                        (*table->sizefunc)(found->key, found->data);
                if (found->key != entry->key) {