summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Pieuchot <mpi@cvs.openbsd.org>2018-09-27 12:36:58 +0000
committerMartin Pieuchot <mpi@cvs.openbsd.org>2018-09-27 12:36:58 +0000
commitc9f4d814b3fa45307c057b15b2c3e826ea53a401 (patch)
tree15b896910edb1c884fa4a74c91f58056e97fd269
parent03e0c316e0aa34577b574e09ec860a0b08a7049a (diff)
Make sure the L2 entry is cloned before dereferencing its parent.
RTF_LOCAL entries or static ARP entries don't have parents, so the logic was incorrect. Note that it might be possible to extend the logic to work with non-cloned L2 entries but the few use cases do not justify the complexity (yet). Problem reported & fix tested by Elie Bouttier. ok bluhm@, visa@, claudio@
-rw-r--r--sys/net/route.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/sys/net/route.c b/sys/net/route.c
index ac773074dcb..7f21d9f118d 100644
--- a/sys/net/route.c
+++ b/sys/net/route.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: route.c,v 1.377 2018/07/11 19:52:19 henning Exp $ */
+/* $OpenBSD: route.c,v 1.378 2018/09/27 12:36:57 mpi Exp $ */
/* $NetBSD: route.c,v 1.14 1996/02/13 22:00:46 christos Exp $ */
/*
@@ -395,11 +395,8 @@ rt_setgwroute(struct rtentry *rt, u_int rtableid)
if (nhrt->rt_ifidx != rt->rt_ifidx) {
struct sockaddr_in6 sa_mask;
- /*
- * If we found a non-L2 entry on a different interface
- * there's nothing we can do.
- */
- if (!ISSET(nhrt->rt_flags, RTF_LLINFO)) {
+ if (!ISSET(nhrt->rt_flags, RTF_LLINFO) ||
+ !ISSET(nhrt->rt_flags, RTF_CLONED)) {
rtfree(nhrt);
return (EHOSTUNREACH);
}