⬢ DragonFlyBSD Kernel Audit
DF-3415 / fix.diff
← back to finding ↓ download raw
--- a/sys/netinet6/in6_pcb.c
+++ b/sys/netinet6/in6_pcb.c
@@ -340,6 +340,18 @@
 	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)nam;
 	int error;
 
+	/*
+	 * Validate the sockaddr BEFORE touching any address fields.
+	 * getsockaddr() allocates exactly namelen bytes, so reading
+	 * sin6_addr on a short sockaddr reads past the end of the
+	 * allocation (DF-3357/DF-3372 read-before-validate family).
+	 * Mirrors the checks in in6_pcbbind() above.
+	 */
+	if (nam->sa_len != sizeof(*sin6))
+		return (EINVAL);
+	if (nam->sa_family != AF_INET6)
+		return (EAFNOSUPPORT);
+
 	/* Reject v4-mapped address */
 	if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr))
 		return EADDRNOTAVAIL;