From 38ef464e415860630e3f8297c10618cf4425e7cc Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 30 Nov 2021 00:20:03 +0900 Subject: [PATCH] network/wireguard: search valid address of the endpoint from all struct addrinfo entries --- src/network/netdev/wireguard.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/network/netdev/wireguard.c b/src/network/netdev/wireguard.c index 2c60ba197d7..e5cfb35c959 100644 --- a/src/network/netdev/wireguard.c +++ b/src/network/netdev/wireguard.c @@ -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) { -- 2.47.3