]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/wireguard: search valid address of the endpoint from all struct addrinfo... 21584/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 29 Nov 2021 15:20:03 +0000 (00:20 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 1 Dec 2021 23:39:37 +0000 (08:39 +0900)
src/network/netdev/wireguard.c

index 2c60ba197d709c26575b7aa439a3db444ca74d89..e5cfb35c9592878d023237509cd04e86ff8df3b4 100644 (file)
@@ -344,17 +344,27 @@ static int wireguard_peer_resolve_handler(
                                    peer->endpoint_host, peer->endpoint_port, gai_strerror(ret));
                 peer->n_retries++;
 
-        } else if ((ai->ai_family == AF_INET && ai->ai_addrlen == sizeof(struct sockaddr_in)) ||
-                   (ai->ai_family == AF_INET6 && ai->ai_addrlen == sizeof(struct sockaddr_in6))) {
-
-                memcpy(&peer->endpoint, ai->ai_addr, ai->ai_addrlen);
-                (void) wireguard_set_interface(netdev);
-                peer->n_retries = 0;
-
         } else {
-                log_netdev_warning(netdev, "Neither IPv4 nor IPv6 address found for peer endpoint %s:%s, ignoring the endpoint.",
-                                   peer->endpoint_host, peer->endpoint_port);
-                peer->n_retries++;
+                bool found = false;
+                for (; ai; ai = ai->ai_next) {
+                        if (!IN_SET(ai->ai_family, AF_INET, AF_INET6))
+                                continue;
+
+                        if (ai->ai_addrlen != (ai->ai_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6)))
+                                continue;
+
+                        memcpy(&peer->endpoint, ai->ai_addr, ai->ai_addrlen);
+                        (void) wireguard_set_interface(netdev);
+                        peer->n_retries = 0;
+                        found = true;
+                        break;
+                }
+
+                if (!found) {
+                        log_netdev_warning(netdev, "Neither IPv4 nor IPv6 address found for peer endpoint %s:%s, ignoring the endpoint.",
+                                           peer->endpoint_host, peer->endpoint_port);
+                        peer->n_retries++;
+                }
         }
 
         if (peer->n_retries > 0) {