From: Wouter Wijngaards Date: Thu, 2 Aug 2007 09:21:58 +0000 (+0000) Subject: Fixup duplicate delegations. X-Git-Tag: release-0.5~165 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dba780a00c2a1e85c923d47e3e06976881ee3947;p=thirdparty%2Funbound.git Fixup duplicate delegations. git-svn-id: file:///svn/unbound/trunk@476 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/doc/Changelog b/doc/Changelog index 02e81e298..e328f1f27 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,6 +1,7 @@ 2 August 2007: Wouter - configure change for latest libevent trunk version (needs -lrt). - query_done and walk_supers are moved out of module interface. + - fixup delegation point duplicates. 1 August 2007: Wouter - set version to 0.5 diff --git a/doc/TODO b/doc/TODO index 2491f87a6..d25c95b76 100644 --- a/doc/TODO +++ b/doc/TODO @@ -28,3 +28,4 @@ o (option) to not send replies to clients after a timeout of (say 5 secs) has passed, but keep task active for later retries by client. o private TTL feature o pretend-dnssec-unaware, and pretend-edns-unaware modes for debug/workshops. +o delegpt use rbtree for ns-list, to avoid slowdown for very large NS sets. diff --git a/iterator/iter_delegpt.c b/iterator/iter_delegpt.c index 0d5a57eae..ecb3c64e5 100644 --- a/iterator/iter_delegpt.c +++ b/iterator/iter_delegpt.c @@ -90,13 +90,20 @@ delegpt_set_name(struct delegpt* dp, struct region* region, uint8_t* name) int delegpt_add_ns(struct delegpt* dp, struct region* region, uint8_t* name) { - struct delegpt_ns* ns = (struct delegpt_ns*)region_alloc(region, + struct delegpt_ns* ns; + size_t len; + (void)dname_count_size_labels(name, &len); + /* slow check for duplicates to avoid counting failures when + * adding the same server as a dependency twice */ + if(delegpt_find_ns(dp, name, len)) + return 1; + ns = (struct delegpt_ns*)region_alloc(region, sizeof(struct delegpt_ns)); if(!ns) return 0; ns->next = dp->nslist; + ns->namelen = len; dp->nslist = ns; - (void)dname_count_size_labels(name, &ns->namelen); ns->name = region_alloc_init(region, name, ns->namelen); ns->resolved = 0; return 1;