]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
dname isroot and dellabel
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Mon, 6 Aug 2007 11:06:00 +0000 (11:06 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Mon, 6 Aug 2007 11:06:00 +0000 (11:06 +0000)
git-svn-id: file:///svn/unbound/trunk@492 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
iterator/iterator.c
testcode/unitdname.c
util/data/dname.c
util/data/dname.h
validator/val_kcache.c

index 85c7e2b5987270ee43f713fef3154fe185bfe4b6..b16c94218bdbb3092bd376ff39e7f7d41b8e35aa 100644 (file)
@@ -1,5 +1,6 @@
 6 August 2007: Wouter
        - key cache for validator.
+       - moved isroot and dellabel to own dname routines, with unit test.
 
 3 August 2007: Wouter
        - replanning.
index 2141d2aeb4c546e57157a207c8f3bc6898734db7..efccdea4bf0f7f9b6101366411f455e59c6ee9d2 100644 (file)
@@ -643,11 +643,9 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
                delnamelen = iq->qchase.qname_len;
        }
        if((iq->qchase.qtype == LDNS_RR_TYPE_DS || iq->refetch_glue)
-               && delname[0] != 0) {
+               && !dname_is_root(delname)) {
                /* do not adjust root label, remove first label from delname */
-               size_t lablen = delname[0] + 1;
-               delname += lablen;
-               delnamelen -= lablen;
+               dname_remove_label(&delname, &delnamelen);
        }
        
        /* Lookup the delegation in the cache. If null, then the cache needs 
index 4473c40a80f4979f8d25f07cbb4ecbd404334eaa..03e3a6e6196f1d6a131f7d9f0edd53f3ef9ac128 100644 (file)
@@ -433,6 +433,36 @@ dname_test_strict_subdomain()
                (uint8_t*)"\007example\003org", 3));
 }
 
+/** test dname_is_root */
+static void
+dname_test_isroot()
+{
+       unit_assert(dname_is_root((uint8_t*)"\000"));
+       unit_assert(!dname_is_root((uint8_t*)"\001a\000"));
+       unit_assert(!dname_is_root((uint8_t*)"\005abvcd\003com\000"));
+       /* malformed dname in this test, but should work */
+       unit_assert(!dname_is_root((uint8_t*)"\077a\000"));
+       unit_assert(dname_is_root((uint8_t*)"\000"));
+}
+
+/** test dname_remove_label */
+static void
+dname_test_removelabel()
+{
+       uint8_t* orig = (uint8_t*)"\007example\003com\000";
+       uint8_t* n = orig;
+       size_t l = 13;
+       dname_remove_label(&n, &l);
+       unit_assert( n == orig+8 );
+       unit_assert( l == 5 );
+       dname_remove_label(&n, &l);
+       unit_assert( n == orig+12 );
+       unit_assert( l == 1 );
+       dname_remove_label(&n, &l);
+       unit_assert( n == orig+12 );
+       unit_assert( l == 1 );
+}
+
 void dname_test()
 {
        ldns_buffer* buff = ldns_buffer_new(65800);
@@ -446,5 +476,7 @@ void dname_test()
        dname_test_pkt_dname_len(buff);
        dname_test_strict_subdomain();
        dname_test_subdomain();
+       dname_test_isroot();
+       dname_test_removelabel();
        ldns_buffer_free(buff);
 }
index 5709b475f7ae09b4f1c9ef5d2094de3540009bd0..f6ee7a677bc696a5e4d301d933e848a0b6cf3058 100644 (file)
@@ -571,3 +571,27 @@ dname_subdomain_c(uint8_t* d1, uint8_t* d2)
        }
        return (m == labs2);
 }
+
+int 
+dname_is_root(uint8_t* dname)
+{
+       uint8_t len;
+       log_assert(dname);
+       len = dname[0];
+       log_assert(!LABEL_IS_PTR(len));
+       return (len == 0);
+}
+
+void 
+dname_remove_label(uint8_t** dname, size_t* len)
+{
+       size_t lablen;
+       log_assert(dname && *dname && len);
+       lablen = (*dname)[0];
+       log_assert(!LABEL_IS_PTR(lablen));
+       log_assert(*len > lablen);
+       if(lablen == 0)
+               return; /* do not modify root label */
+       *len -= lablen+1;
+       *dname += lablen+1;
+}
index d5a8ccaaf0369abad992d70b8ab813dfd597f0c3..3b673388ea2fb9add86c24d8d386369ad7d76b1b 100644 (file)
@@ -207,4 +207,19 @@ void dname_print(FILE* out, ldns_buffer* pkt, uint8_t* dname);
  */
 void dname_str(uint8_t* dname, char* str);
 
+/**
+ * Returns true if the uncompressed wireformat dname is the root "."
+ * @param dname: the dname to check
+ * @return true if ".", false if not.
+ */
+int dname_is_root(uint8_t* dname);
+
+/**
+ * Snip off first label from a dname, returning the parent zone.
+ * @param dname: from what to strip off. uncompressed wireformat.
+ * @param len: length, adjusted to become less.
+ * @return stripped off, or "." if input was ".".
+ */
+void dname_remove_label(uint8_t** dname, size_t* len);
+
 #endif /* UTIL_DATA_DNAME_H */
index 663d2b04b2308bb59613cd8464c4d1080fb27e61..5635e4266318a224e1b6072aaf66aa9fd78f67ef 100644 (file)
@@ -43,6 +43,7 @@
 #include "validator/val_kentry.h"
 #include "util/log.h"
 #include "util/config_file.h"
+#include "util/data/dname.h"
 
 struct key_cache* 
 key_cache_create(struct config_file* cfg)
@@ -140,10 +141,9 @@ key_cache_obtain(struct key_cache* kcache, uint8_t* name, size_t namelen,
                        lock_rw_unlock(&k->entry.lock);
                }
                /* snip off first label to continue */
-               if(name[0] == 0 || namelen <= 1)
+               if(dname_is_root(name))
                        break;
-               namelen -= (size_t)name[0] + 1;
-               name += (size_t)name[0] + 1;
+               dname_remove_label(&name, &namelen);
        }
        return NULL;
 }