From: Antonio Quartulli
Date: Fri, 27 Dec 2024 16:17:55 +0000 (+0100)
Subject: override ai_family if 'local' numeric address was specified
X-Git-Tag: v2.7_alpha1~134
X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8b209d9e5d80799eec931e2fec9b15f7e2c1a7b0;p=thirdparty%2Fopenvpn.git
override ai_family if 'local' numeric address was specified
This change ensures that when a numeric IP address is specified
as argument to a 'local' directive, its ai_family overrides
the one extracted from the 'proto' config option.
Change-Id: Ie2471e6b2d6974e70423b09918ad1c2136253754
Signed-off-by: Antonio Quartulli
Signed-off-by: Gianmarco De Gregori
Acked-by: Gert Doering
Message-Id: <20241227161755.4010-1-gert@greenie.muc.de>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg30257.html
Signed-off-by: Gert Doering
---
diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c
index 01874fe27..b895bd4f2 100644
--- a/src/openvpn/socket.c
+++ b/src/openvpn/socket.c
@@ -467,9 +467,8 @@ openvpn_getaddrinfo(unsigned int flags,
sig_info = &sigrec;
}
- /* try numeric ipv6 addr first */
+ /* try numeric ip addr first */
CLEAR(hints);
- hints.ai_family = ai_family;
hints.ai_flags = AI_NUMERICHOST;
if (flags & GETADDR_PASSIVE)
@@ -486,6 +485,13 @@ openvpn_getaddrinfo(unsigned int flags,
hints.ai_socktype = SOCK_STREAM;
}
+ /* if hostname is not set, we want to bind to 'ANY', with
+ * the correct address family - v4-only or v6/v6-dual-stack */
+ if (!hostname)
+ {
+ hints.ai_family = ai_family;
+ }
+
status = getaddrinfo(hostname, servname, &hints, res);
if (status != 0) /* parse as numeric address failed? */
@@ -497,6 +503,10 @@ openvpn_getaddrinfo(unsigned int flags,
const char *fmt;
int level = 0;
+ /* this is not a numeric IP, therefore force resolution using the
+ * provided ai_family */
+ hints.ai_family = ai_family;
+
if (hostname && (flags & GETADDR_RANDOMIZE))
{
hostname = hostname_randomize(hostname, &gc);
@@ -1690,6 +1700,10 @@ resolve_bind_local(struct link_socket *sock, const sa_family_t af)
sock->local_host, sock->local_port,
gai_strerror(status));
}
+
+ /* the resolved 'local entry' might have a different family than what
+ * was globally configured */
+ sock->info.af = sock->info.lsa->bind_local->ai_family;
}
gc_free(&gc);