]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/utils kr_sockaddr_key_same_addr(): more precision
authorVladimír Čunát <vladimir.cunat@nic.cz>
Fri, 13 May 2022 10:52:20 +0000 (12:52 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Fri, 13 May 2022 11:17:45 +0000 (13:17 +0200)
... in case of IPv6 link-local addresses.
The casting isn't very nice, but we certainly rely on `family` being
always on the same offset anyway (and it's ensured by standards).

lib/utils.c

index 50e6bfdac7485f0cfcd1187fba5e119e490bec2c..5d89e28c3e09815836ef6d7125ba2968f3844a68 100644 (file)
@@ -395,8 +395,8 @@ struct sockaddr *kr_sockaddr_from_key(struct sockaddr_storage *dst,
 
 bool kr_sockaddr_key_same_addr(const char *key_a, const char *key_b)
 {
-       const struct kr_sockaddr_key *kkey_a = (struct kr_sockaddr_key *) key_a;
-       const struct kr_sockaddr_key *kkey_b = (struct kr_sockaddr_key *) key_b;
+       const struct kr_sockaddr_in6_key *kkey_a = (struct kr_sockaddr_in6_key *) key_a;
+       const struct kr_sockaddr_in6_key *kkey_b = (struct kr_sockaddr_in6_key *) key_b;
 
        if (kkey_a->family != kkey_b->family)
                return false;
@@ -407,6 +407,8 @@ bool kr_sockaddr_key_same_addr(const char *key_a, const char *key_b)
                        offset = offsetof(struct kr_sockaddr_in_key, address);
                        break;
                case AF_INET6:
+                       if (unlikely(kkey_a->scope != kkey_b->scope))
+                               return false;
                        offset = offsetof(struct kr_sockaddr_in6_key, address);
                        break;