aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorosy <50960678+osy@users.noreply.github.com>2021-09-26 15:36:00 -0700
committerosy <50960678+osy@users.noreply.github.com>2021-09-26 15:48:49 -0700
commitcec8d31d7a48c216e83e3505c41d9ac1aa493159 (patch)
treea586710b55cca79cf531839830c75e66f84b61bb
parent23db43abdb5740287bbb7cbf5cc99eb22e121298 (diff)
downloadslirp-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.c18
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)";
}