diff --git a/src/libfreeswan/atoaddr.c b/src/libfreeswan/atoaddr.c index c962a1627..cbda541d3 100644 --- a/src/libfreeswan/atoaddr.c +++ b/src/libfreeswan/atoaddr.c @@ -108,7 +108,8 @@ struct in_addr *addrp; } else { - memcpy(&addrp->s_addr, res->ai_addr->sa_data, sizeof(addrp->s_addr)); + struct sockaddr_in *in = (struct sockaddr_in*)res->ai_addr; + memcpy(&addrp->s_addr, &in->sin_addr.s_addr, sizeof(addrp->s_addr)); freeaddrinfo(res); } diff --git a/src/libfreeswan/ttoaddr.c b/src/libfreeswan/ttoaddr.c index ede0713f0..bda2be5ed 100644 --- a/src/libfreeswan/ttoaddr.c +++ b/src/libfreeswan/ttoaddr.c @@ -202,8 +202,35 @@ ip_address *dst; } else { - addr = res->ai_addr->sa_data; - err = initaddr(addr, res->ai_addrlen, af, dst); + struct addrinfo *r = res; + while (r) + { + size_t addr_len; + switch (r->ai_family) + { + case AF_INET: + { + struct sockaddr_in *in = (struct sockaddr_in*)r->ai_addr; + addr_len = 4; + addr = (unsigned char*)&in->sin_addr.s_addr; + break; + } + case AF_INET6: + { + struct sockaddr_in6 *in6 = (struct sockaddr_in6*)r->ai_addr; + addr_len = 16; + addr = (unsigned char*)&in6->sin6_addr.s6_addr; + break; + } + default: + { /* unknown family, try next result */ + r = r->ai_next; + continue; + } + } + err = initaddr(addr, addr_len, r->ai_family, dst); + break; + } freeaddrinfo(res); }