From 7836e14b3344922caa82dd7e650c7e446563f0f1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= Date: Fri, 13 May 2022 12:52:20 +0200 Subject: [PATCH] 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). --- lib/utils.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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; -- 2.47.2