]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Fixup duplicate delegations.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 2 Aug 2007 09:21:58 +0000 (09:21 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 2 Aug 2007 09:21:58 +0000 (09:21 +0000)
git-svn-id: file:///svn/unbound/trunk@476 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
doc/TODO
iterator/iter_delegpt.c

index 02e81e298ff345fad07efa555e4f88efa88cb366..e328f1f275d7eab2723fdb70cc8b450f4d5cb31c 100644 (file)
@@ -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
index 2491f87a64e743a39b4546b665bcbef7a17aabab..d25c95b76db55ba31523bc1e8142fdefbbb345a5 100644 (file)
--- 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.
index 0d5a57eaed93462a7c63b0bb75872d35b3068c8e..ecb3c64e50d650031c367c4941c16fd3dfb021b7 100644 (file)
@@ -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;