diff options
author | Simon Kelley <simon@thekelleys.org.uk> | 2015-01-18 22:11:10 +0000 |
---|---|---|
committer | Simon Kelley <simon@thekelleys.org.uk> | 2015-01-18 22:11:10 +0000 |
commit | 393415597c8b5b09558b789ab9ac238dbe3db65d (patch) | |
tree | f751fb4a0703c50b115cb474185293d55e4d79c1 | |
parent | ae4624bf46b5e37ff1a9a2ba3c927e0dede95adb (diff) | |
download | dnsmasq-393415597c8b5b09558b789ab9ac238dbe3db65d.tar.gz |
Cope with multiple interfaces with the same LL address.
-rw-r--r-- | CHANGELOG | 4 | ||||
-rw-r--r-- | src/auth.c | 5 | ||||
-rw-r--r-- | src/util.c | 1 |
3 files changed, 9 insertions, 1 deletions
@@ -49,6 +49,10 @@ version 2.73 sometimes reasons to do it. (Step forward, GFW). To avoid misuse, there's a hard limit on the TTL floor of one hour. Thansk to RinSatsuki for the patch. + + Cope with multiple interfaces with the same link-local + address. (IPv6 addresses are scoped, so this is allowed.) + Thanks to Cory Benfield for help with this. version 2.72 @@ -413,7 +413,10 @@ size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t n peer_addr->in.sin_port = 0; #ifdef HAVE_IPV6 else - peer_addr->in6.sin6_port = 0; + { + peer_addr->in6.sin6_port = 0; + peer_addr->in6.sin6_scope_id = 0; + } #endif for (peers = daemon->auth_peers; peers; peers = peers->next) @@ -274,6 +274,7 @@ int sockaddr_isequal(union mysockaddr *s1, union mysockaddr *s2) #ifdef HAVE_IPV6 if (s1->sa.sa_family == AF_INET6 && s1->in6.sin6_port == s2->in6.sin6_port && + s1->in6.sin6_scope_id == s2->in6.sin6_scope_id && IN6_ARE_ADDR_EQUAL(&s1->in6.sin6_addr, &s2->in6.sin6_addr)) return 1; #endif |