diff options
author | osy <50960678+osy@users.noreply.github.com> | 2021-09-26 15:36:00 -0700 |
---|---|---|
committer | osy <50960678+osy@users.noreply.github.com> | 2021-09-26 15:48:49 -0700 |
commit | cec8d31d7a48c216e83e3505c41d9ac1aa493159 (patch) | |
tree | a586710b55cca79cf531839830c75e66f84b61bb | |
parent | 23db43abdb5740287bbb7cbf5cc99eb22e121298 (diff) | |
download | slirp-cec8d31d7a48c216e83e3505c41d9ac1aa493159.zip slirp-cec8d31d7a48c216e83e3505c41d9ac1aa493159.tar.gz slirp-cec8d31d7a48c216e83e3505c41d9ac1aa493159.tar.bz2 |
resolv: fix IPv6 resolution on Darwin
res_sockaddr_union() has a field for IPv4 and a field for IPv6. When we
used `&servers[i].sin.sin_addr`, it does not return the right address
for IPv6.
-rw-r--r-- | src/slirp.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/slirp.c b/src/slirp.c index a669b45..0583e5b 100644 --- a/src/slirp.c +++ b/src/slirp.c @@ -143,6 +143,10 @@ static int get_dns_addr_libresolv(int af, void *pdns_addr, void *cached_addr, union res_sockaddr_union servers[NI_MAXSERV]; int count; int found; + void *addr; + + // we only support IPv4 and IPv4, we assume it's one or the other + assert(af == AF_INET || af == AF_INET6); if (res_ninit(&state) != 0) { return -1; @@ -155,11 +159,16 @@ static int get_dns_addr_libresolv(int af, void *pdns_addr, void *cached_addr, if (af == servers[i].sin.sin_family) { found++; } + if (af == AF_INET) { + addr = &servers[i].sin.sin_addr; + } else { // af == AF_INET6 + addr = &servers[i].sin6.sin6_addr; + } // we use the first found entry if (found == 1) { - memcpy(pdns_addr, &servers[i].sin.sin_addr, addrlen); - memcpy(cached_addr, &servers[i].sin.sin_addr, addrlen); + memcpy(pdns_addr, addr, addrlen); + memcpy(cached_addr, addr, addrlen); if (scope_id) { *scope_id = 0; } @@ -171,10 +180,7 @@ static int get_dns_addr_libresolv(int af, void *pdns_addr, void *cached_addr, break; } else if (slirp_debug & DBG_MISC) { char s[INET6_ADDRSTRLEN]; - const char *res = inet_ntop(servers[i].sin.sin_family, - &servers[i].sin.sin_addr, - s, - sizeof(s)); + const char *res = inet_ntop(af, addr, s, sizeof(s)); if (!res) { res = " (string conversion error)"; } |