Fixing address resolution via getaddrinfo in libfreeswan.
This commit is contained in:
parent
8a17c1f907
commit
333b461aa6
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue