DragonFlyBSD Kernel Audit
DF-0312 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -562,7 +562,10 @@
 				/* Link ID is not embedded by the user */
 				sa6->sin6_addr.s6_addr16[1] =
 				    htons(ifp->if_index);
-			} else if (sa6->sin6_addr.s6_addr16[1] !=
+			} else if (sa6->sin6_addr.s6_addr16[1] != 0 &&
+			   ntohs(sa6->sin6_addr.s6_addr16[1]) >= if_index) {
+			return (ENXIO);	/* bogus zone id: avoid OOB ifindex2ifnet[] read */
+		} else if (sa6->sin6_addr.s6_addr16[1] !=
 			    htons(ifp->if_index)) {
 				/* Link ID contradicts */
 				return (EINVAL);