]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Fix to squelch udp connect errors in the log at low verbosity about
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Wed, 8 May 2024 14:40:41 +0000 (16:40 +0200)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Wed, 8 May 2024 14:40:41 +0000 (16:40 +0200)
  invalid argument for IPv6 link local addresses.

doc/Changelog
services/outside_network.c
util/net_help.c
util/net_help.h

index 533d4a314ac65fcf9d8e8c311e5f8142cb702573..24ae5f04ae3df917cfc20d96d497dd2444c24cbd 100644 (file)
@@ -1,3 +1,7 @@
+8 May 2024: Wouter
+       - Fix to squelch udp connect errors in the log at low verbosity about
+         invalid argument for IPv6 link local addresses.
+
 7 May 2024: Wouter
        - Merge #1062: Fix potential overflow bug while parsing port in
          function cfg_mark_ports.
index 1f89740da360fb4d960a0c820ffcdd3a30aef059..eab94535c9c3abc38777ee820d309fc248cc7989 100644 (file)
@@ -2051,7 +2051,8 @@ select_id(struct outside_network* outnet, struct pending* pend,
 }
 
 /** return true is UDP connect error needs to be logged */
-static int udp_connect_needs_log(int err)
+static int udp_connect_needs_log(int err, struct sockaddr_storage* addr,
+       socklen_t addrlen)
 {
        switch(err) {
        case ECONNREFUSED:
@@ -2075,6 +2076,15 @@ static int udp_connect_needs_log(int err)
                if(verbosity >= VERB_ALGO)
                        return 1;
                return 0;
+       case EINVAL:
+               /* Stop 'Invalid argument for fe80::/10' addresses appearing
+                * in the logs, at low verbosity. They cannot be sent to. */
+               if(addr_is_ip6linklocal(addr, addrlen)) {
+                       if(verbosity >= VERB_ALGO)
+                               return 1;
+                       return 0;
+               }
+               break;
        default:
                break;
        }
@@ -2141,7 +2151,8 @@ select_ifport(struct outside_network* outnet, struct pending* pend,
                                /* connect() to the destination */
                                if(connect(fd, (struct sockaddr*)&pend->addr,
                                        pend->addrlen) < 0) {
-                                       if(udp_connect_needs_log(errno)) {
+                                       if(udp_connect_needs_log(errno,
+                                               &pend->addr, pend->addrlen)) {
                                                log_err_addr("udp connect failed",
                                                        strerror(errno), &pend->addr,
                                                        pend->addrlen);
index d2218ea883324692ee943b8d1baf9299910196c1..a1bd71865eb353ad6e8db23e3199893d31358c63 100644 (file)
@@ -862,6 +862,20 @@ addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen)
        return (memcmp(s, map_prefix, 12) == 0);
 }
 
+int addr_is_ip6linklocal(struct sockaddr_storage* addr, socklen_t addrlen)
+{
+       const uint8_t prefix[2] = {0xfe, 0x80};
+       int af = (int)((struct sockaddr_in6*)addr)->sin6_family;
+       void* sin6addr = &((struct sockaddr_in6*)addr)->sin6_addr;
+       uint8_t start[2];
+       if(af != AF_INET6 || addrlen<(socklen_t)sizeof(struct sockaddr_in6))
+               return 0;
+       /* Put the first 10 bits of sin6addr in start, match fe80::/10. */
+       memmove(start, sin6addr, 2);
+       start[1] &= 0xc0;
+       return memcmp(start, prefix, 2) == 0;
+}
+
 int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen)
 {
        int af = (int)((struct sockaddr_in*)addr)->sin_family;
index edaea42353d480afe887550c87be39f5338e2387..1c57b5b7019c38930bd88add35af56a273079434 100644 (file)
@@ -362,6 +362,14 @@ void addr_to_nat64(const struct sockaddr_storage* addr,
  */
 int addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen);
 
+/**
+ * See if sockaddr is an ipv6 fe80::/10 link local address.
+ * @param addr: address
+ * @param addrlen: length of address
+ * @return true if so
+ */
+int addr_is_ip6linklocal(struct sockaddr_storage* addr, socklen_t addrlen);
+
 /**
  * See if sockaddr is 255.255.255.255.
  * @param addr: address