aboutsummaryrefslogtreecommitdiffstats
path: root/src/libfreeswan
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2009-08-18 12:30:11 +0200
committerTobias Brunner <tobias@strongswan.org>2009-08-18 12:30:11 +0200
commit333b461aa689c29197dadb2a15abc3ccade0c89a (patch)
tree459ef51e75a4bf2cdde5aea7caed2830c457d909 /src/libfreeswan
parent8a17c1f9079edc7901d0342a5b746b9d1dcb2704 (diff)
downloadstrongswan-333b461aa689c29197dadb2a15abc3ccade0c89a.tar.bz2
strongswan-333b461aa689c29197dadb2a15abc3ccade0c89a.tar.xz
Fixing address resolution via getaddrinfo in libfreeswan.4.3.4
Diffstat (limited to 'src/libfreeswan')
-rw-r--r--src/libfreeswan/atoaddr.c3
-rw-r--r--src/libfreeswan/ttoaddr.c31
2 files changed, 31 insertions, 3 deletions
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);
}