From 8daf2ebe4c1c6b8375c40c8833a4627ab769a601 Mon Sep 17 00:00:00 2001 From: Yuri Schaeffer Date: Thu, 17 Oct 2013 10:01:03 +0000 Subject: [PATCH] Don't crash on empty node git-svn-id: file:///svn/unbound/branches/edns-subnet@2987 be551aaa-1e26-0410-a405-d3ace91eadb9 --- edns-subnet/addrtree.c | 2 +- edns-subnet/subnetmod.c | 5 +++++ edns-subnet/subnetmod.h | 4 ++++ testcode/unitvandergaast.c | 10 +++++++--- util/storage/lruhash.c | 1 + 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/edns-subnet/addrtree.c b/edns-subnet/addrtree.c index 7e47f9ac1..5afb91963 100644 --- a/edns-subnet/addrtree.c +++ b/edns-subnet/addrtree.c @@ -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; } diff --git a/edns-subnet/subnetmod.c b/edns-subnet/subnetmod.c index ddc0fa103..4ff30757d 100644 --- a/edns-subnet/subnetmod.c +++ b/edns-subnet/subnetmod.c @@ -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 */ diff --git a/edns-subnet/subnetmod.h b/edns-subnet/subnetmod.h index 48b310188..33ee815fd 100644 --- a/edns-subnet/subnetmod.h +++ b/edns-subnet/subnetmod.h @@ -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 */ diff --git a/testcode/unitvandergaast.c b/testcode/unitvandergaast.c index 85428939d..ac3a9f7ea 100644 --- a/testcode/unitvandergaast.c +++ b/testcode/unitvandergaast.c @@ -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); } diff --git a/util/storage/lruhash.c b/util/storage/lruhash.c index 560cf9015..e96708b88 100644 --- a/util/storage/lruhash.c +++ b/util/storage/lruhash.c @@ -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 Bspace_used += need_size - (*table->sizefunc)(found->key, found->data); if (found->key != entry->key) { -- 2.47.2