]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Fixup decompression for private-name checks.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 6 Nov 2008 10:59:31 +0000 (10:59 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 6 Nov 2008 10:59:31 +0000 (10:59 +0000)
git-svn-id: file:///svn/unbound/trunk@1334 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
doc/plan
iterator/iter_priv.c
iterator/iter_priv.h
iterator/iter_scrub.c

index 48585cbe99e2452e1f405f6267ad0e7782f39b91..20bd1684a81b52de50fe7ff49385823072690f4a 100644 (file)
@@ -1,3 +1,6 @@
+6 November 2008: Wouter
+       - dname_priv must decompress the name before comparison.
+
 5 November 2008: Wouter
        - fixed possible memory leak in key_entry_key deletion.
          Would leak a couple bytes when trust anchors were replaced.
index 7096bcc8073d9eb666478c6613cbb132eb84c764..90f1599d57adbf2eb224cb5d6428c0f523f091e9 100644 (file)
--- a/doc/plan
+++ b/doc/plan
@@ -77,7 +77,7 @@ not   stats on SIGUSR1. perhaps also see which slow auth servers cause >1sec value
 + direct queries for NS records
 + careful caching, only NS query causes referral caching.
 + direct queries for A, AAAA in-bailiwick from a referral.
-* trouble counter, cache wipe threshold.
++ trouble counter, cache wipe threshold.
 
 + off-path validation
 + root NS, root glue validation after prime
@@ -101,4 +101,5 @@ o on windows version, implement that OS ancillary data capabilities for
   interface-automatic. IPPKTINFO, IP6PKTINFO for WSARecvMsg, WSASendMsg.
 o local-zone directive with authority service, full authority server 
   is a non-goal.
+o configure option to force use of builtin ldns tarball.
 
index ccd530b874acca95972a719d60cc78b9ed6a39d2..6d8aad955067328f488e1f168888385f25ea0801 100644 (file)
@@ -180,16 +180,24 @@ priv_lookup_addr(struct iter_priv* priv, struct sockaddr_storage* addr,
 /**
  * See if a name is whitelisted.
  * @param priv: structure for address storage.
+ * @param pkt: the packet (for compression ptrs).
  * @param name: name to check.
  * @param dclass: class to check.
  * @return: true if the name is OK. false if unlisted.
  */
 static int 
-priv_lookup_name(struct iter_priv* priv, uint8_t* name, uint16_t dclass)
+priv_lookup_name(struct iter_priv* priv, ldns_buffer* pkt,
+       uint8_t* name, size_t dname_len, uint16_t dclass)
 {
        size_t len;
-       int labs = dname_count_size_labels(name, &len);
-       return name_tree_lookup(&priv->n, name, len, labs, dclass) != NULL;
+       uint8_t decomp[256];
+       int labs;
+       if(dname_len >= sizeof(decomp))
+               return 0;
+       dname_pkt_copy(pkt, decomp, name);
+       labs = dname_count_size_labels(decomp, &len);
+       log_assert(dname_len == len);
+       return name_tree_lookup(&priv->n, decomp, len, labs, dclass) != NULL;
 }
 
 size_t priv_get_mem(struct iter_priv* priv)
@@ -198,10 +206,12 @@ size_t priv_get_mem(struct iter_priv* priv)
        return sizeof(*priv) + regional_get_mem(priv->region);
 }
 
-int priv_rrset_bad(struct iter_priv* priv, struct rrset_parse* rrset)
+int priv_rrset_bad(struct iter_priv* priv, ldns_buffer* pkt,
+       struct rrset_parse* rrset)
 {
        /* see if it is a private name, that is allowed to have any */
-       if(priv_lookup_name(priv, rrset->dname, ntohs(rrset->rrset_class))) {
+       if(priv_lookup_name(priv, pkt, rrset->dname, rrset->dname_len,
+               ntohs(rrset->rrset_class))) {
                return 0;
        } else {
                /* so its a public name, check the address */
index b7177ccadc46cc5f5343a58d46f2ef1c95daa933..62860ffb58ebcd98574fa73853c0db7db7c8def5 100644 (file)
@@ -92,10 +92,12 @@ int priv_apply_cfg(struct iter_priv* priv, struct config_file* cfg);
 /**
  * See if rrset is bad.
  * @param priv: structure for private address storage.
+ * @param pkt: packet to decompress rrset name in.
  * @param rrset: the rrset to examine, A or AAAA.
  * @return true if the rrset is bad and should be removed.
  */
-int priv_rrset_bad(struct iter_priv* priv, struct rrset_parse* rrset);
+int priv_rrset_bad(struct iter_priv* priv, ldns_buffer* pkt, 
+       struct rrset_parse* rrset);
 
 /**
  * Get memory used by priv structure.
index 09abb219adf6b25f0d1e2a6cd71056a413b61138..f57c8a365cab6a27287675daae9f7fc6f7fda14e 100644 (file)
@@ -614,7 +614,7 @@ scrub_sanitize(ldns_buffer* pkt, struct msg_parse* msg,
                /* remove private addresses */
                if( (rrset->type == LDNS_RR_TYPE_A || 
                        rrset->type == LDNS_RR_TYPE_AAAA) &&
-                       priv_rrset_bad(ie->priv, rrset)) {
+                       priv_rrset_bad(ie->priv, pkt, rrset)) {
                        /* set servfail, so the classification becomes
                         * THROWAWAY, instead of LAME or other unwanted */
                        FLAGS_SET_RCODE(msg->flags, LDNS_RCODE_SERVFAIL);