From: Vladimír Čunát Date: Fri, 13 May 2022 10:52:20 +0000 (+0200) Subject: lib/utils kr_sockaddr_key_same_addr(): more precision X-Git-Tag: v5.5.1~15^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7836e14b3344922caa82dd7e650c7e446563f0f1;p=thirdparty%2Fknot-resolver.git lib/utils kr_sockaddr_key_same_addr(): more precision ... 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). --- diff --git a/lib/utils.c b/lib/utils.c index 50e6bfdac..5d89e28c3 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -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;