summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorotto <otto@openbsd.org>2020-05-10 06:44:07 +0000
committerotto <otto@openbsd.org>2020-05-10 06:44:07 +0000
commit5bf84caaa4c940bb65ae5789904e9cf23f5febfd (patch)
tree8044e913ab78ff5c473d5641a98c43fa0f3754e3
parentUse a double-underscore prefix for local variables declared in macros (diff)
downloadwireguard-openbsd-5bf84caaa4c940bb65ae5789904e9cf23f5febfd.tar.xz
wireguard-openbsd-5bf84caaa4c940bb65ae5789904e9cf23f5febfd.zip
sockaddr_rtdns does not guarantee alignment of the buffer. So first
memcpy the address into a local var before comparing it with code that reads ints using int *. at least sparc64 and landisk suffer from this. with and ok jca@
-rw-r--r--sbin/unwind/resolver.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/sbin/unwind/resolver.c b/sbin/unwind/resolver.c
index 3974ad39db3..874ad5e76b3 100644
--- a/sbin/unwind/resolver.c
+++ b/sbin/unwind/resolver.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: resolver.c,v 1.123 2020/03/19 19:27:21 tobhe Exp $ */
+/* $OpenBSD: resolver.c,v 1.124 2020/05/10 06:44:07 otto Exp $ */
/*
* Copyright (c) 2018 Florian Obser <florian@openbsd.org>
@@ -1918,18 +1918,23 @@ replace_autoconf_forwarders(struct imsg_rdns_proposal *rdns_proposal)
}
for (i = 0; i < rdns_count; i++) {
+ struct in_addr addr4;
+ struct in6_addr addr6;
+
switch (af) {
case AF_INET:
- if (((struct in_addr *)src)->s_addr == INADDR_LOOPBACK)
+ memcpy(&addr4, src, sizeof(struct in_addr));
+ if (addr4.s_addr == INADDR_LOOPBACK)
continue;
- ns = inet_ntop(af, (struct in_addr *)src, ntopbuf,
+ ns = inet_ntop(af, &addr4, ntopbuf,
INET6_ADDRSTRLEN);
src += sizeof(struct in_addr);
break;
case AF_INET6:
- if (IN6_IS_ADDR_LOOPBACK((struct in6_addr *)src))
+ memcpy(&addr6, src, sizeof(struct in6_addr));
+ if (IN6_IS_ADDR_LOOPBACK(&addr6))
continue;
- ns = inet_ntop(af, (struct in6_addr *)src, ntopbuf,
+ ns = inet_ntop(af, &addr6, ntopbuf,
INET6_ADDRSTRLEN);
src += sizeof(struct in6_addr);
}