From 2092b5d936acd1b69269ace0d22e862790ad57b3 Mon Sep 17 00:00:00 2001 From: "Coren[m]" Date: Sun, 15 Sep 2013 08:20:37 +0200 Subject: [PATCH 1/2] addr_resolve() rewrite broke { (ipv6enabled == true) name => IPv4 address } network.c: - addr_resolve(): save AF_UNSPEC ip4 address into ip4, not into to->ip4 --- toxcore/network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toxcore/network.c b/toxcore/network.c index 6ae131602..83081a498 100644 --- a/toxcore/network.c +++ b/toxcore/network.c @@ -744,7 +744,7 @@ int addr_resolve(const char *address, IP *to, IP *extra) #ifdef TOX_ENABLE_IPV6 else if (!(rc & 1)) { struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr; - to->ip4.in_addr = addr->sin_addr; + ip4.in_addr = addr->sin_addr; rc |= 1; } #endif From 1e1782a952d1476d49c63fd1a3966e85eb3a09d4 Mon Sep 17 00:00:00 2001 From: "Coren[m]" Date: Sun, 15 Sep 2013 08:33:09 +0200 Subject: [PATCH 2/2] ip_equal(): handle embedded v4 vs. native v4 as equal network.c: - ip_equal(): on IPv4 vs. IPv6, check if the IPv6 is an embedded IPv4 and if true, compare that --- toxcore/network.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/toxcore/network.c b/toxcore/network.c index 83081a498..44448f386 100644 --- a/toxcore/network.c +++ b/toxcore/network.c @@ -480,11 +480,24 @@ int ip_equal(IP *a, IP *b) return 0; #ifdef TOX_ENABLE_IPV6 - if (a->family == AF_INET) - return (a->ip4.in_addr.s_addr == b->ip4.in_addr.s_addr); + /* same family */ + if (a->family == b->family) { + if (a->family == AF_INET) + return (a->ip4.in_addr.s_addr == b->ip4.in_addr.s_addr); + else if (a->family == AF_INET6) + return IN6_ARE_ADDR_EQUAL(&a->ip6, &b->ip6); + else + return 0; + } - if (a->family == AF_INET6) - return IN6_ARE_ADDR_EQUAL(&a->ip6, &b->ip6); + /* different family: check on the IPv6 one if it is the IPv4 one embedded */ + if ((a->family == AF_INET) && (b->family == AF_INET6)) { + if (IN6_IS_ADDR_V4COMPAT(&b->ip6)) + return (a->ip4.in_addr.s_addr == b->ip6.s6_addr32[3]); + } else if ((a->family == AF_INET6) && (b->family == AF_INET)) { + if (IN6_IS_ADDR_V4COMPAT(&a->ip6)) + return (a->ip6.s6_addr32[3] == b->ip4.in_addr.s_addr); + } return 0; #else