]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
suppress ipv4mapped errors from logs.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 1 Apr 2009 10:01:43 +0000 (10:01 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 1 Apr 2009 10:01:43 +0000 (10:01 +0000)
git-svn-id: file:///svn/unbound/trunk@1570 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
testcode/unitmain.c
util/net_help.c
util/net_help.h
util/netevent.c
util/random.c

index e2fb79e5665c43bab448d2b43f7437e83b481fa0..68c114e505918107b907d50e418a48b713aac060 100644 (file)
@@ -1,3 +1,9 @@
+1 April 2009: Wouter
+       - suppress errors when trying to contact authority servers that gave
+         ipv6 AAAA records for their nameservers with ipv4 mapped contents.
+         Still tries to do so, could work when deployed in intranet.
+         Higher verbosity shows the error.
+
 30 March 2009: Wouter
        - Fixup LDFLAGS from libevent sourcedir compile configure restore.
        - Fixup so no non-absolute rpaths are added.
index fb0d88f299beb94a137e471e1566ba0bb3e09ce0..a8b4763b86d3d79e0a816c22dcbd9549bc8754e5 100644 (file)
@@ -238,6 +238,29 @@ net_test()
                                (struct sockaddr_storage*)&b6, i, l6) == i);
                }
        }
+       /* test addr_is_ip4mapped */
+       if(1) {
+               struct sockaddr_storage a;
+               socklen_t l = (socklen_t)sizeof(a);
+               unit_assert(ipstrtoaddr("12.13.14.15", 53, &a, &l));
+               unit_assert(!addr_is_ip4mapped(&a, l));
+               unit_assert(ipstrtoaddr("fe80::217:31ff:fe91:df", 53, &a, &l));
+               unit_assert(!addr_is_ip4mapped(&a, l));
+               unit_assert(ipstrtoaddr("ffff::217:31ff:fe91:df", 53, &a, &l));
+               unit_assert(!addr_is_ip4mapped(&a, l));
+               unit_assert(ipstrtoaddr("::ffff:31ff:fe91:df", 53, &a, &l));
+               unit_assert(!addr_is_ip4mapped(&a, l));
+               unit_assert(ipstrtoaddr("::fffe:fe91:df", 53, &a, &l));
+               unit_assert(!addr_is_ip4mapped(&a, l));
+               unit_assert(ipstrtoaddr("::ffff:127.0.0.1", 53, &a, &l));
+               unit_assert(addr_is_ip4mapped(&a, l));
+               unit_assert(ipstrtoaddr("::ffff:127.0.0.2", 53, &a, &l));
+               unit_assert(addr_is_ip4mapped(&a, l));
+               unit_assert(ipstrtoaddr("::ffff:192.168.0.2", 53, &a, &l));
+               unit_assert(addr_is_ip4mapped(&a, l));
+               unit_assert(ipstrtoaddr("2::ffff:192.168.0.2", 53, &a, &l));
+               unit_assert(!addr_is_ip4mapped(&a, l));
+       }
 }
 
 #include "util/config_file.h"
index c77ccdc7ca539fc926c2a4ded4f3924e4d030445..66276b519df734b3d7d7f29f4d24ba61f37995d0 100644 (file)
@@ -474,3 +474,17 @@ addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
                snprintf(buf, len, "(inet_ntop_error)");
        }
 }
+
+int 
+addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen)
+{
+       /* prefix for ipv4 into ipv6 mapping is ::ffff:x.x.x.x */
+       const uint8_t map_prefix[16] = 
+               {0,0,0,0,  0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
+       uint8_t* s;
+       if(!addr_is_ip6(addr, addrlen))
+               return 0;
+       /* s is 16 octet ipv6 address string */
+       s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
+       return (memcmp(s, map_prefix, 12) == 0);
+}
index 0a60cae9883d1389bbb6a0e187260239587eb046..8fa486722714f833714eb4d152d8e224da2d261a 100644 (file)
@@ -269,4 +269,12 @@ int addr_in_common(struct sockaddr_storage* addr1, int net1,
 void addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
        char* buf, size_t len);
 
+/**
+ * See if sockaddr is an ipv6 mapped ipv4 address, ::ffff:0.0.0.0
+ * @param addr: address
+ * @param addrlen: length of address
+ * @return true if so
+ */
+int addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen);
+
 #endif /* NET_HELP_H */
index 6ec949562d5eb8c034ef49cf7a1fa543025de7db..7989f9c2fa21cbd671477a770ec29cd0385e0f67 100644 (file)
@@ -254,6 +254,12 @@ comm_point_send_udp_msg(struct comm_point *c, ldns_buffer* packet,
                if(errno == ENETUNREACH && verbosity < VERB_ALGO)
                        return 0;
 #endif
+               /* squelch errors where people deploy AAAA ::ffff:bla for
+                * authority servers, which we try for intranets. */
+               if(errno == EINVAL && addr_is_ip4mapped(
+                       (struct sockaddr_storage*)addr, addrlen) &&
+                       verbosity < VERB_DETAIL)
+                       return 0;
 #ifndef USE_WINSOCK
                verbose(VERB_OPS, "sendto failed: %s", strerror(errno));
 #else
index c86fdf673901dbeb972c51d905beb69fef5b0bb5..d98b8891755593b608ce91a5f048dff5b17f22f9 100644 (file)
@@ -81,7 +81,7 @@ struct ub_randstate {
 /** Number of bytes to reseed after */
 #define REKEY_BYTES    (1 << 24)
 
-/** (re)setup system seed */
+/* (re)setup system seed */
 void
 ub_systemseed(unsigned int seed)
 {