From: W.C.A. Wijngaards Date: Thu, 15 Oct 2020 07:17:57 +0000 (+0200) Subject: zonemd, fix anchor unlock. X-Git-Tag: release-1.13.2rc1~269^2~55 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e6aab488c8ed1332266d9aeaad00adaa81bf4cde;p=thirdparty%2Funbound.git zonemd, fix anchor unlock. zonemd, unit test for dnssec verify function test harness. --- diff --git a/services/authzone.c b/services/authzone.c index 6bbb88a20..7c75441d5 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -8013,10 +8013,12 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env) /* equal to trustanchor, no need for online lookups */ dnskey = zonemd_get_dnskey_from_anchor(z, env, anchor, &is_insecure, &reason, &keystorage); + lock_basic_unlock(&anchor->lock); if(!dnskey && !reason) { reason = "dnskey verify with anchor failed"; } } else if(anchor) { + lock_basic_unlock(&anchor->lock); /* perform online lookups */ /* setup online lookups, and wait for them */ if(zonemd_lookup_dnskey(z, env)) { diff --git a/testcode/unitmain.c b/testcode/unitmain.c index 84d850e5f..b5aa8fe42 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -844,6 +844,7 @@ static void respip_test(void) #include "services/authzone.h" #include "util/data/dname.h" #include "util/regional.h" +#include "validator/val_anchor.h" /** Add zone from file for testing */ struct auth_zone* authtest_addzone(struct auth_zones* az, const char* name, char* fname); @@ -920,6 +921,7 @@ static void zonemd_generate_test(const char* zname, char* zfile, /** loop over files and test generated zonemd digest */ static void zonemd_generate_tests(void) { + unit_show_func("services/authzone.c", "auth_zone_generate_zonemd_hash"); zonemd_generate_test("example.org", "testdata/zonemd.example1.zone", 1, 2, "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D481B7"); @@ -974,6 +976,7 @@ static void zonemd_check_test(void) if(!zonemd_hashalgo_supported(hashalgo)) return; /* cannot test unsupported algo */ + unit_show_func("services/authzone.c", "auth_zone_generate_zonemd_check"); /* setup environment */ az = auth_zones_create(); @@ -1021,12 +1024,75 @@ static void zonemd_check_test(void) sldns_buffer_free(buf); } +/** zonemd test verify */ +static void zonemd_verify_test(void) +{ + struct module_stack mods; + struct module_env env; + char* tastr = "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af"; + char* zname = "example.org"; + char* zfile = "testdata/zonemd.example1.zone"; + char* date_override = "20180302005009"; + struct auth_zone* z; + unit_show_func("services/authzone.c", "auth_zone_verify_zonemd"); + + /* setup test harness */ + memset(&mods, 0, sizeof(mods)); + memset(&env, 0, sizeof(env)); + env.scratch = regional_create(); + if(!env.scratch) + fatal_exit("out of memory"); + env.scratch_buffer = sldns_buffer_new(65553); + if(!env.scratch_buffer) + fatal_exit("out of memory"); + env.cfg = config_create(); + if(!env.cfg) + fatal_exit("out of memory"); + env.cfg->val_date_override = cfg_convert_timeval(date_override); + if(!env.cfg->val_date_override) + fatal_exit("could not parse datetime %s", date_override); + env.anchors = anchors_create(); + if(!env.anchors) + fatal_exit("out of memory"); + env.auth_zones = auth_zones_create(); + if(!env.auth_zones) + fatal_exit("out of memory"); + modstack_init(&mods); + if(!modstack_config(&mods, "validator iterator")) + fatal_exit("could not init modules"); + env.mesh = mesh_create(&mods, &env); + if(!env.mesh) + fatal_exit("out of memory"); + + /* load data */ + if(!anchor_store_str(env.anchors, env.scratch_buffer, tastr)) + fatal_exit("could not store anchor: %s", tastr); + z = authtest_addzone(env.auth_zones, zname, zfile); + if(!z) + fatal_exit("could not addzone %s %s", zname, zfile); + + /* test */ + lock_rw_wrlock(&z->lock); + auth_zone_verify_zonemd(z, &env); + lock_rw_unlock(&z->lock); + + /* desetup test harness */ + mesh_delete(env.mesh); + modstack_desetup(&mods, &env); + auth_zones_delete(env.auth_zones); + anchors_delete(env.anchors); + config_delete(env.cfg); + regional_destroy(env.scratch); + sldns_buffer_free(env.scratch_buffer); +} + /** zonemd unit tests */ static void zonemd_test(void) { unit_show_feature("zonemd"); zonemd_generate_tests(); zonemd_check_test(); + zonemd_verify_test(); } void unit_show_func(const char* file, const char* func)