[PATCH v2 20/42] wireguard: Tokenize host for getaddrinfo()
Jussi Laakkonen <[email protected]> Wed, 13 Aug 2025 18:01:52 +0300
| Newsgroups | dev.linux.lists.connman |
|---|---|
| Message-ID | <[email protected]> |
The host parameter contains the address and netmask in CIDR notation
with IPv6 to define also the PrefixLength to be used in D-Bus for
connmand. getaddrinfo() relies inet_pton() that does not work with the
notation so tokenize host before passing it to getaddrinfo().
---
vpn/plugins/wireguard.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/vpn/plugins/wireguard.c b/vpn/plugins/wireguard.c
index ee97f378..2f077880 100644
--- a/vpn/plugins/wireguard.c
+++ b/vpn/plugins/wireguard.c
@@ -187,8 +187,25 @@ static int parse_endpoint(const char *host, const char *port, struct sockaddr_u
{
struct addrinfo hints;
struct addrinfo *result, *rp;
+ char **tokens;
int sk;
int err;
+ unsigned int len;
+
+ /*
+ * getaddrinfo() relies on inet_pton() that suggests using addresses
+ * without CIDR notation. Host should contain the address in CIDR
+ * notation to be able to pass the prefix length to ConnMan via D-Bus.
+ */
+ tokens = g_strsplit(host, "/", -1);
+ len = g_strv_length(tokens);
+ if (len > 2 || len < 1) {
+ DBG("Failure tokenizing host %s", host);
+ g_strfreev(tokens);
+ return -EINVAL;
+ }
+
+ DBG("using host %s", tokens[0]);
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
@@ -196,7 +213,9 @@ static int parse_endpoint(const char *host, const char *port, struct sockaddr_u
hints.ai_flags = 0;
hints.ai_protocol = 0;
- err = getaddrinfo(host, port, &hints, &result);
+ err = getaddrinfo(tokens[0], port, &hints, &result);
+ g_strfreev(tokens);
+
if (err < 0) {
DBG("Failed to resolve host address: %s", gai_strerror(err));
return -EINVAL;
--
2.39.5